例如,根据预处理器语法,以下内容被正确解析为pp-number:
123_e+1
但是,将其放置在符合C++11标准的代码片段中,
int operator"" _e(unsigned long long)
{ return 0; }
int test()
{
return 123_e+1;
}
目前的Clang或GCC编译器(我未测试其他编译器)将返回类似于以下错误:
unable to find numeric literal operator 'operator""_e+1'
当试图定义operator"" _e+1(...)
时,会发现未找到operator"" _e(...)
。这似乎是因为编译器首先将标记解析为pp-number
,但在解析最终表达式时失败回滚并应用user-defined-integer-literal
的语法规则。
相比之下,以下代码可以成功编译:
int operator"" _d(unsigned long long)
{ return 0; }
int test()
{
return 0x123_d+1; // doesn't lex as a 'pp-number' because 'sign' can only follow [eEpP]
}
这是标准的正确解读吗?如果是,编译器应该处理这个边角案例,这种情况可能比较罕见,但是否合理呢?
pp-number
_ 词法包括下划线的identifier-nondigit
和 _nondigit
_。 - Andy G+
没有被包括在内?有趣的是:p/P 被包括进去了,但是 0x 前缀也没有... - Aconcaguapp-number
...我认为这些构造规则太泛泛了,下一个标准可能会更精确(有两条路径:只有在尚未出现标识符的情况下才允许e sign
,反之亦然)... - Aconcagua