Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在表达式中使用用户定义的文本有时需要空格_C++_C++11_User Defined Literals - Fatal编程技术网

C++ 在表达式中使用用户定义的文本有时需要空格

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: 如果输入流已被解析为预处理令牌,则 给定字符: [此处不适用的两个例外情况] 否则,下一个预处理标记

以下代码以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:

如果输入流已被解析为预处理令牌,则 给定字符:

  • [此处不适用的两个例外情况]
  • 否则,下一个预处理标记是可能构成预处理标记的最长字符序列,即使 将导致进一步的词汇分析失败,除了 标题名称(2.8)仅在
    #include
    指令(16.2)中形成
问题在于
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 .