c++ - 完全表达的定义是否存在矛盾
问题描述
full-expression 的定义如下:
intro.execution#12
一个完整的表达式是
- 未评估的操作数,
- 一个常量表达式,
- 一个 init-declarator 或一个 mem-initializer,包括初始化器的组成表达式,
- 在临时对象以外的对象的生命周期结束时生成的析构函数的调用,或
- 一个表达式,它不是另一个表达式的子表达式,也不是完整表达式的一部分。
考虑以下代码:
0+1;
定义说constant-expression
的是一个完整的表达式,由于在表达式内0+1
,它的0
和1
都是常量表达式,因此它们都是full-expression
,但是最后一个项目符号说an expression that is not a subexpression of another expression
的是一个完整的表达式。但无论是操作数0
还是1
,它们都是表达式的子表达式,0+1
表达式0+1
是全表达式。而且0
,1
也是那个完整表达的一部分。这意味着有时,第二个子弹会与最后一个子弹相矛盾。这个怎么解释。是否与完整表达的定义相矛盾?
当将表达式0+1
作为初始化器时。由于这条规则,它似乎是完整表达的一部分:
对于初始化程序,执行实体的初始化(包括评估聚合的默认成员初始化程序)也被视为full-expression 的一部分。
表达式0+1
本身是一个常量表达式,所以它被当作一个完整的表达式来反驳。但是,当它作为初始化器时,它是完整表达式的一部分,那么0+1
在这种情况下,常量表达式是否是完整表达式?
解决方案
请参阅第四个要点末尾的“或”一词。它应该适用于整个列表,即如果一个表达式匹配一个或多个项目符号,它就是一个完整的表达式。
case0+1
匹配第二个 bullet ,所以它是一个完整的表达式。它与其他任何子弹都不匹配,但这不是问题。
推荐阅读
- matlab - matlab 通过 tcp/ip 调用 matlab
- c# - 无法从程序集“Microsoft.EntityFrameworkCore.Relational”加载类型“RelationalReferenceCollectionBuilderExtensions”
- ruby-on-rails - 自定义 Rails 初始化程序作为一个类
- awk - 如何在 gsub 中读取参数
- php - 如何使用 PHP 从 HTML 中提取表格
- sql - 触发器一直无法编译。表存在时未找到索赔表
- perl - perl hash ref return: { 'a' =>1, % { sub() } }
- android - Android:找不到符号变量错误
- linux - 创建 ssh 用户,始终登录文件夹
- android - 无法使用 Firebase 云消息向 Android 设备发送推送通知