繁体   English   中英

使用用户定义的文字在C ++ 11中有条件地包含?

[英]Conditional inclusion in C++11 with user-defined literal?

在C ++ 11中,当一个表单的预处理指令...

#if expr

遇到...时, expr被计算为16.1 [cpp.cond]描述的constant-expression

这是在expr上的宏替换之后完成的,其标识符(和关键字)被替换为0,其preprocessing-tokens被转换为tokensdefined运算符被评估,等等。

我的问题是当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被转换为tokensdefined运算符被评估,等等。

我的问题是当expr中的一个tokensuser-defined-literal什么?

该计划格式不正确。

我的观点的核心是从16.1/1脚注147的观察中收集到的,在翻译阶段4中除了宏名称之外没有其他identifiers

参数:

根据2.14.8 [lex.ext]/2

user-defined-literal被视为对literal operatorliteral operator template的调用(13.5.8)

所以在这里,即使在16.1/4描述的所有替换之后,我们仍然有一个(运算符)函数的剩余调用。 (其他尝试,例如使用constexpr函数,将被所有非宏identifiers替换为0来阻止。)

由于这发生在翻译阶段4,所以还没有定义或甚至声明的功能; 尝试查找literal-operator-id必须失败(参见16.1/1中的脚注147以获得类似的参数)。

从略微不同的角度看,我们发现: 5.19/2

conditional-expressioncore 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#ifndefdefined的参数。 例如,假设我从未#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM