C++ 使用基本多语言平面之外的字符文字代码点分配char16_t

C++ 使用基本多语言平面之外的字符文字代码点分配char16_t,c++,unicode,language-lawyer,utf-16,string-literals,C++,Unicode,Language Lawyer,Utf 16,String Literals,在我今天早些时候观看的一次关于Unicode的演讲中,当您试图分配一个太长而无法用char16\t类型表示的字符文本时,会出现一些混乱。演示者说,基于对标准的阅读,程序应该是格式错误的,但gcc无论如何都接受它。他没有澄清,Youtube也不允许我提问 我自己的测试确认以下代码被g++-4.8和g++-4.9接受。(带有警告。) 另一方面,Clang3.4会产生一个错误 哪个编译器是正确的?我找不到这方面的章节 另外一个小问题,字符文字部分§2.14.3未提及W语法或部分正文中的\u和\u转

在我今天早些时候观看的一次关于Unicode的演讲中,当您试图分配一个太长而无法用
char16\t
类型表示的字符文本时,会出现一些混乱。演示者说,基于对标准的阅读,程序应该是格式错误的,但gcc无论如何都接受它。他没有澄清,Youtube也不允许我提问

我自己的测试确认以下代码被g++-4.8和g++-4.9接受。(带有警告。)


另一方面,Clang3.4会产生一个错误

哪个编译器是正确的?我找不到这方面的章节


另外一个小问题,字符文字部分§2.14.3未提及W语法或部分正文中的
\u
\u
转义序列。这是一个疏忽吗?

程序格式不正确,应该无法编译

2.14.3/2以字母u开头的字符文字,如u'y',是char16\u t类型的字符文字。这个 包含单个c字符的char16_t文字的值等于其ISO 10646代码点值,前提是 代码点可用单个16位代码单元表示。(也就是说,前提是它是一种基本的多语种语言。) 平面代码点。)如果值在16位内不可表示,程序格式错误

我的

\u
\u
不是2.14.3所指的转义序列。它们是通用字符名,如2.3/2所述。它们不限于字符和字符串文字,但可能出现:


\u0410
A
,又名西里尔语大写字母A。

我真不敢相信我在正确的章节中,完全错过了它。:/谢谢而且,通用字符名称,我猜它们是必需的,但是,对于C++来说,制作一个合适的IDE,只会带来更大的挑战。我假设翻译是在像trigraphs这样的标记化过程中完成的,这会带来有趣的模糊代码机会。翻译的各个阶段,包括处理trigraphs和通用字符名的细节,在2.2/1中进行了描述
int main() {
  char16_t a = u'\U0001F378';
}
int main() {
    int \u0410 = 42;
    return \u0410;
}