在表达式中使用用户自定义字面量有时需要空格。

7
以下代码能够在GCC和Clang编译器中都通过编译:
long double operator""_a(long double);     
auto x = 0e1_a+0; // OK 

但是不是这样(将_a替换成_e):
long double operator""_e(long double);
auto y = 0e1_e+0; // Error: unable to find numeric literal operator 'operator""_e+0'

另一方面,这段代码可以编译:

auto z = 0e1_e +0; // OK

发生了什么?

(这个问题的灵感来自这个 GCC 错误报告。)

1个回答

14

最大匹配策略再次发挥作用。

[lex.pptoken]/p3:

如果输入流已解析到给定字符的预处理标记:

  • [这里不涉及的两种例外情况]
  • 否则,下一个预处理标记是能构成预处理标记的最长字符序列,即使这会导致进一步的词法分析失败。但是,头文件名(2.8)只在#include指令(16.2)中形成。

问题在于,与0e1_a+0不同,0e1_e+0是有效的预处理数字([lex.ppnumber]):

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 .

结果是,0e1_e+0被解析为单个pp-number预处理标记,然后在稍后由于无法转换为有效标记(显而易见的原因)而爆炸。

另一方面,0e1_a+0被解析为三个标记,0e1_a+0,一切都很好。


所以对于每个以 eE 结尾的名称都会发生这种情况 :/ - Jarod42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接