直接在character-literal中输入unicode而不是使用universal-character-name是
Is it illegal directly putting in unicode in character-literal instead of using universal-character-name?
根据ISO/IEC 14882:2011(§2.14.3),字符字面量也称为常量,如下所示。
character-literal:
’ c-char-sequence ’
u’ c-char-sequence ’
U’ c-char-sequence ’
L’ c-char-sequence ’
...
c-char:
any member of the source character set except
the single-quote ’, backslash , or new-line character
escape-sequence
universal-character-name
乍一看,似乎直接在character-literal中使用unicode而不是universal-character-name是非法的。然而,大多数编译器(如g++和visual studio c++)根本不使用它,这有点令人困惑。无论标准如何,每个实现是否在编译开始之前自动将这些unicode转换为universal-character-name ?
我认为第一个"翻译阶段"处理的是(c++ 11 2.2/1:1.):
任何不在基本源字符集(2.3)中的源文件字符将被指定该字符的通用字符-name替换。
所以你的输入文件是在源字符集中编码的,其中包括基本的源字符集,但是在程序文本中,所有的非基本字符都被它们的通用字符-name代替。
它是实现定义的:
§2.2翻译阶段:
- […接受的物理源文件字符集是由实现定义的。[…任何源文件字符不在基本源字符集(2.3)被指定该字符的通用字符-name取代。(实现可以使用任何内部编码,只要是实际的扩展字符在源文件中遇到的,并且在源文件中表示为universal-character-name(即使用uXXXX表示法)的处理方式与[…]相同。
相关文章:
- C#:委托、紧凑访问者"universal callable"参数类型
- 为什么"universal references"具有与右值引用相同的语法?
- "universal-character-name encountered in source"警告的目的是什么?
- GMock 和 Gtest 支持 Windows 10 Universal 平台
- "Universal character name conversion" C++是什么意思?
- 如何通过函数中的指针操作char*或chara[]
- 为什么选择"universal reference"重载而不是字符数组或字符指针?
- 直接在character-literal中输入unicode而不是使用universal-character-name是