考虑以下代码片段:
struct vec2 {
int x;
int y;
};
constexpr vec2 Up{0,1};
constexpr vec2 Down{0,-1};
constexpr vec2 Left{-1,0};
constexpr vec2 Right{1,0};
上面的代码片段编译没有问题,被认为是有效和正确的语法。
现在考虑以下被认为是非法或无效语法的演示:
struct vec2 {
int x;
int y;
};
constexpr vec2 ↑{0,1}; // Windows Alt Code: Alt+24
constexpr vec2 ↓{0,-1}; // Windows Alt Code: Alt+25
constexpr vec2 ←{-1,0}; // Windows Alt Code: Alt+27
constexpr vec2 →{1,0}; // Windows Alt Code: Alt+26
Compiler Explorer 给出了这些编译器错误:
C3872
我知道他们作为标识符是不合格和无效的。我只是想弄清楚为什么它们被 C++ 语言禁止,标准对它们有什么规定,以及它在语言标准中的什么地方可以找到。阻止这些成为有效标识符的原因是什么?
箭头字符的代码点值为 U+2190 到 U+2193。
C++17 和 C++20 的 [lex.name] 表 2 中列出了标识符中允许的 UCS/Unicode 代码点(此处链接为 C++17 之前的草案 N4659),在所有先前版本(从 C++98 开始)的标准附件 E,以及 C++23 的 [lex.name]/1 中的 Unicode 标准附件 #31 参考(此处链接为当前草案)。
在这些范围内都没有被列为允许范围,因此编译器应该在字符/字符串文字之外将它们解析为非空白单字符预处理器标记,然后应该将其作为格式错误的标记拒绝。代码点列表来源于JTC1/SC22/WG20的ISO/IEC 10176《
编程语言标准编写指南》。这里有 WG20 的文件注册.
快速浏览一下,我找不到任何关于具体包含箭头符号的范围的可访问讨论,但据我所知,这里的意图不是一般地扩展由数字、拉丁字母和_
组成的传统标识符语法,但仅将此语法的“字母”部分国际化以允许在本机脚本中编写标识符,即除了传统代码点范围之外允许的代码点范围代表(大部分)不同语言的字母或脚本的其他部分,但不是标点符号。我认为没有很多人支持将字符(序列)作为标识符,这些字符在视觉上更可能被视为标点符号、运算符或符号。特别是 C++23 中对 UAX #31 的更改导致标识符中不允许使用表情符号。根据相关提案