Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 你是'\U0001ABCD';实现定义了值还是格式不正确?_C++_Character Encoding_C++11_Standards_Literals - Fatal编程技术网

C++ 你是'\U0001ABCD';实现定义了值还是格式不正确?

C++ 你是'\U0001ABCD';实现定义了值还是格式不正确?,c++,character-encoding,c++11,standards,literals,C++,Character Encoding,C++11,Standards,Literals,该标准似乎对包含不能用char16\u t表示的字符的char16\u t文本有两种不同的响应。首先,如果代码点值不能用16位表示(即它不在基本多语言平面(BMP)中),则程序的格式不正确(§2.14.3/2): 包含单个c字符的char16\u tliteral的值等于其ISO 10646代码点值,前提是该代码点可以用单个16位代码单元表示。(也就是说,如果它是一个基本的多语言平面码点。)如果该值在16位内不可表示,则该程序的格式不正确 由于\U0001ABCD是单个c字符,但不在BMP中,因

该标准似乎对包含不能用
char16\u t
表示的字符的
char16\u t
文本有两种不同的响应。首先,如果代码点值不能用16位表示(即它不在基本多语言平面(BMP)中),则程序的格式不正确(§2.14.3/2):

包含单个c字符的
char16\u t
literal的值等于其ISO 10646代码点值,前提是该代码点可以用单个16位代码单元表示。(也就是说,如果它是一个基本的多语言平面码点。)如果该值在16位内不可表示,则该程序的格式不正确

由于
\U0001ABCD
是单个c字符,但不在BMP中,因此包含它的程序格式不正确

好的,但在同一章的后面,它说如果值超出了实现定义的范围
char16_t
,那么文字具有实现定义的值(§2.14.3/4):

如果字符文字的值不在为[…]
char16\u t
定义的实现定义的范围内(对于前缀为“
u
”的文字),[…]

由于
char16\u t
的实现定义范围必须至少为16位(才能存储整个BMP),因此我们已经知道,对于超出该范围的值,程序的格式不正确。为什么标准要费心给它一个实现定义的值


1产生式规则为c-char->universal character name->
\U
hex quad

根据2.14.3/2,程序格式不正确,这意味着必须诊断错误。无需进一步分析,因为不需要实现来完成编译或生成可执行文件。文字可以被认为仍然有一个值,但它并不重要


(尽管允许实现编译和执行格式不正确的程序。因此,我认为在这种情况下,字符文本仍然被指定为具有值这一事实很重要。)

有趣的是,gcc 4.7编译得很好。只是警告:“字符常量对于其类型来说太长[默认情况下已启用]”,所以要清楚,
char16_t c=u'\U0001ABCD'格式不正确,但
char16\u t s[]=u“\U0001ABCD”不是,同意吗?@KerrekSB同意。具体而言,字符文字的格式不正确。另请参见:gcc过去的行为很奇怪。由于要求UCS的行为与文字字符相同,因此它们使UCS的行为与UTF-8序列相同。UTF-8序列的行为也没有经过刻意设计;它只是从实现中掉了出来。IMHO clang的behavor更有意义(尽管gcc 4.7可能已经修复了之前的所有问题)。你确定吗?我用了一个事实,那就是不回答。我想它只是塞进了一个愚蠢的段落。