在 C++11 中,当表单的预处理指令...
#if expr
...遇到,expr
被评估为 a constant-expression
,如 中所述16.1 [cpp.cond]
。
这是在宏替换 on 之后完成的expr
,它的标识符(和关键字)被 0 替换,它preprocessing-tokens
被转换为tokens
,defined
运算符被评估,等等。
我的问题是当其中一个标记expr
是 a时会发生什么user-defined-literal
?
用户定义的文字就像函数调用,但函数调用不能在expr
(我认为)中发生,这是标识符替换的副作用。但是从技术上讲user-defined-literals
可以生存。
我怀疑这是一个错误,但我不太明白如何从标准中得出结论?
[cpp]
也许只是忽略了在第 16 条上添加用户定义的文字的(迂腐的)影响?
还是我错过了什么?
更新:
举个例子来说明:
这个预处理是什么:
#if 123_foo + 5.5 > 100
bar
#else
baz
#endif
bar 或 baz 还是错误?
GCC 4.7 报告:
test.cpp:1:5: error: user-defined literal in preprocessor expression
所以它认为这是一个错误。参考标准可以证明这是合理的吗?或者这只是“隐含的”?