请考虑以下代码段:
#include <iostream>
template <class T>
void print(const T& t) {
std::cout << static_cast<unsigned long long>(t) << " " << sizeof(t) << "\n";
}
int main() {
auto cU = U'\xFFFFFFFF';
auto cL = L'\xFFFFFFFF';
auto cQ = '\xFFFFFFFF1'; // warning in gcc; error in clang
print(cU);
print(cL);
print(cQ);
}
此代码在gcc中编译时发出警告,并在clang中出现相同文本错误:
十六进制转义序列超出范围
2.14.3 / 4的C ++ 14标准说:
十六进制序列中的位数没有限制。
但同时包含对可能类型的字符文字的限制:char
,wchar_t
,char16_t
或char32_t
。这意味着可能类型的最大大小不超过32位。即十六进制序列的最大长度(仅十六进制数部分)限制为8.
我的问题是:为什么Standard会说无限长度的十六进制序列以及如何使用超过8位的十六进制序列?
答案 0 :(得分:1)
您的编译器供应商可能希望提出一个8字节字符类型作为扩展名。
对字符 literal 设置限制会阻止使用文字对这些类型进行初始化。