[英]Conditional inclusion in C++11 with user-defined literal?
在C ++ 11中,当一个表单的预处理指令...
#if expr
遇到...时, expr
被计算为16.1 [cpp.cond]
描述的constant-expression
。
这是在expr
上的宏替换之后完成的,其标识符(和关键字)被替换为0,其preprocessing-tokens
被转换为tokens
, defined
运算符被评估,等等。
我的问题是当expr
中的一个标记是user-defined-literal
什么?
用户定义的文字就像函数调用,但函数调用不能在expr
发生(我认为),作为标识符替换的副作用。 然而,技术上user-defined-literals
可以存活。
我怀疑这是一个错误,但我不明白如何从标准中得出结论?
也许忽略了在第16条[cpp]
上添加用户定义文字的(迂腐)影响?
或者我错过了什么?
更新:
通过一个例子澄清:
这预处理到什么:
#if 123_foo + 5.5 > 100
bar
#else
baz
#endif
吧或巴兹还是错误的?
GCC 4.7报告:
test.cpp:1:5: error: user-defined literal in preprocessor expression
所以它认为这是一个错误。 这可以参考标准来证明吗? 或者这只是“隐含的”?
在C ++ 11中,当遇到形式为...
#if expr ...
的预处理指令时,expr
被计算为一个constant-expression
,如16.1 [cpp.cond]
。这是在
expr
上的宏替换之后完成的,其标识符(和关键字)被替换为0
,其preprocessing-tokens
被转换为tokens
,defined
运算符被评估,等等。我的问题是当
expr
中的一个tokens
是user-defined-literal
什么?
该计划格式不正确。
我的观点的核心是从16.1/1
脚注147
的观察中收集到的,在翻译阶段4中除了宏名称之外没有其他identifiers
。
参数:
根据2.14.8 [lex.ext]/2
user-defined-literal
被视为对literal operator
或literal operator template
的调用(13.5.8)
。
所以在这里,即使在16.1/4
描述的所有替换之后,我们仍然有一个(运算符)函数的剩余调用。 (其他尝试,例如使用constexpr
函数,将被所有非宏identifiers
替换为0
来阻止。)
由于这发生在翻译阶段4,所以还没有定义或甚至声明的功能; 尝试查找literal-operator-id
必须失败(参见16.1/1
中的脚注147以获得类似的参数)。
从略微不同的角度看,我们发现: 5.19/2
:
conditional-expression
是core constant expression
除非它涉及以下之一作为潜在评估的子表达式(3.2)[...]:
- [...]
- 调用除了文字类或constexpr函数的constexpr构造函数之外的函数;
- 调用未定义的constexpr函数或未定义的constexpr构造函数[...];
由此,在constant expression
使用user-defined literal
需要定义的 constexpr literal operator
,该literal operator
在转换阶段4中也不可用。
gcc拒绝这一点是对的。
在C ++ 11中,当遇到
#ifdef expr
形式的预处理指令时,expr
被评估为16.1所述的常量表达式。 这是在expr上的宏替换之后完成的,其标识符(和关键字)被替换为0,其预处理标记被转换为标记,定义的运算符被评估,等等。
没有!
不计算#ifdef
, #ifndef
或defined
的参数。 例如,假设我从未#define
预处理器符号SYMBOL_THAT_IS_NEVER_DEFINED
。 这完全有效:
#ifdef SYMBOL_THAT_IS_NEVER_DEFINED
code
#endif
扩展未定义符号的符号是非法的。 假设尚未定义SYMBOL_THAT_IS_NEVER_DEFINED
这是非法的:
#if SYMBOL_THAT_IS_NEVER_DEFINED
code
#endif
类似于在解除引用之前检查指针是否为非空,在使用之前检查符号是否合法是合法的:
#if (defined SYMBOL_THAT_MIGHT_BE_DEFINED) && SYMBOL_THAT_MIGHT_BE_DEFINED
code
#endif
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.