首页 > 解决方案 > 完全表达的定义是否存在矛盾

问题描述

full-expression 的定义如下:
intro.execution#12

一个完整的表达式是

  • 未评估的操作数,
  • 一个常量表达式,
  • 一个 init-declarator 或一个 mem-initializer,包括初始化器的组成表达式,
  • 在临时对象以外的对象的生命周期结束时生成的析构函数的调用,或
  • 一个表达式,它不是另一个表达式的子表达式,也不是完整表达式的一部分

考虑以下代码:

0+1;

定义说constant-expression的是一个完整的表达式,由于在表达式内0+1,它的01都是常量表达式,因此它们都是full-expression,但是最后一个项目符号说an expression that is not a subexpression of another expression的是一个完整的表达式。但无论是操作数0还是1,它们都是表达式的子表达式,0+1表达式0+1是全表达式。而且01也是那个完整表达的一部分。这意味着有时,第二个子弹会与最后一个子弹相矛盾。这个怎么解释。是否与完整表达的定义相矛盾?

当将表达式0+1作为初始化器时。由于这条规则,它似乎是完整表达的一部分:

对于初始化程序,执行实体的初始化(包括评估聚合的默认成员初始化程序)也被视为full-expression 的一部分

表达式0+1本身是一个常量表达式,所以它被当作一个完整的表达式来反驳。但是,当它作为初始化器时,它是完整表达式的一部分,那么0+1在这种情况下,常量表达式是否是完整表达式?

标签: c++c++17language-lawyer

解决方案


请参阅第四个要点末尾的“或”一词。它应该适用于整个列表,即如果一个表达式匹配一个或多个项目符号,它就是一个完整的表达式。

case0+1匹配第二个 bullet ,所以它是一个完整的表达式。它与其他任何子弹都不匹配,但这不是问题。


推荐阅读