在我今天早些时候看过的关于Unicode的一次演讲中,当你试图分配一个太长而无法用char16_t
类型表示的字符文字时,会发生什么样的混淆。主持人表示,基于对标准的阅读,该程序应该是格式错误的,但gcc无论如何都会接受它。他没有澄清,Youtube不允许我提问。
我自己的测试证实g ++ - 4.8和g ++ - 4.9接受以下代码。 (有警告。)
int main() {
char16_t a = u'\U0001F378';
}
http://coliru.stacked-crooked.com/a/6cb2206660407a8d
https://eval.in/188979
另一方面,clang 3.4会产生错误。
哪个编译器正确?我找不到这一章和经文。
另外一个小问题,字符文字部分§2.14.3没有提到W语法或部分正文中的\u
和\U
转义序列。这是疏忽吗?
答案 0 :(得分:3)
该程序格式不正确,无法编译。
2.14.3 / 2 以字母u开头的字符文字,例如u'y',是char16_t类型的字符文字。该 包含单个c-char的char16_t文字的值等于其ISO 10646代码点值,前提是这样 代码点可用单个16位代码单元表示。 (也就是说,只要它是基本的多语言 平面代码点。)如果该值在16位内无法表示,程序格式错误 ......
强调我的。
\u
和\U
不是 2.14.3 含义内的转义序列。它们是通用角色名称,在 2.3 / 2 中描述。它们不仅限于字符和字符串文字,但可能显示为anywhere in the program:
int main() {
int \u0410 = 42;
return \u0410;
}
\u0410
是A
,又名Cyrillic Capital Letter A.