C++ 在表达式中使用用户定义的文本有时需要空格
以下代码以GCC和Clang两种格式编译:C++ 在表达式中使用用户定义的文本有时需要空格,c++,c++11,user-defined-literals,C++,C++11,User Defined Literals,以下代码以GCC和Clang两种格式编译: long double operator""_a(long double); auto x = 0e1_a+0; // OK 但不是这样(将\u a替换为\u e): OTOH,这段代码编译: auto z = 0e1_e +0; // OK 发生什么事了 (这个问题的灵感来源于。)最大咀嚼再次出现 [lex.pptoken]/p3: 如果输入流已被解析为预处理令牌,则 给定字符: [此处不适用的两个例外情况] 否则,下一个预处理标记
long double operator""_a(long double);
auto x = 0e1_a+0; // OK
但不是这样(将\u a
替换为\u e
):
OTOH,这段代码编译:
auto z = 0e1_e +0; // OK
发生什么事了
(这个问题的灵感来源于。)最大咀嚼再次出现 [lex.pptoken]/p3: 如果输入流已被解析为预处理令牌,则 给定字符:
- [此处不适用的两个例外情况]
- 否则,下一个预处理标记是可能构成预处理标记的最长字符序列,即使
将导致进一步的词汇分析失败,除了
标题名称(2.8)仅在
指令(16.2)中形成#include
0e1_e+0
与0e1_a+0
不同,它是一个有效的预处理编号([lex.ppnumber]):
因此,0e1_e+0
被解析为单个pp编号预处理令牌,然后由于无法转换为有效令牌(出于明显原因)而在稍后分解
另一方面,
0e1_a+0
被解析为三个标记,0e1_a
,+
,和0
,一切都很好。因此,每一个以e
或e
结尾的名字都是这样的:/
auto z = 0e1_e +0; // OK
pp-number:
digit
. digit
pp-number digit
pp-number identifier-nondigit
pp-number ’ digit
pp-number ’ nondigit
pp-number e sign
pp-number E sign
pp-number .