mad*_*ada 3 c++ expression initializer language-lawyer
我有这个代码示例:
struct S {};
S s = S();
Run Code Online (Sandbox Code Playgroud)
根据我的理解,我看到s = S()声明中S s = S()是一个init-declarator,其中s是 a declarator,并且= S()是一个初始化器。
另外,我看到初始化程序( = S()) 是一个大括号或等于初始化程序,即"=initializer-clause"。这意味着最终这S()是一个初始化子句。
根据语法,初始化子句要么是赋值表达式,要么是大括号初始化列表。事实上,S()可能不是一个花括号初始化列表,但它可能是一个赋值表达式。
如果到目前为止我的分析是正确的,那么我有一个问题:
赋值S()表达式如何?表达式中的赋值运算符在哪里?S()
换句话说,赋值表达式的语法是:
assignment-expression:
conditional-expression
yield-expression
throw-expression
logical-or-expression assignment-operator initializer-clause
Run Code Online (Sandbox Code Playgroud)
怎么S()可能是上述之一?
类似地, throw 表达式的语法是
throw-expression:
throw assignment-expression
Run Code Online (Sandbox Code Playgroud)
S()in 语句怎么throw S();是赋值表达式?
S()赋值表达式如何?
因为它匹配第一个选项条件表达式,如下所示。请注意每个部分中强调的部分,最后我们到达的simple-type-specifier ( expression-listopt )是S()。
赋值表达式:
- 条件表达式
- 产量表达式
- 抛出表达式
- 逻辑或表达式赋值运算符初始值设定项子句
接下来,我们进入条件表达式:
条件表达式:
- 逻辑或表达式
- 逻辑或表达式 ? 表达式:赋值表达式
接下来,逻辑或表达式:
逻辑或表达式:
- 逻辑与表达式
- 逻辑或表达式 || 逻辑与表达式
接下来,逻辑与表达式:
逻辑与表达式:
- 包含或表达
- 逻辑与表达式 && 包含或表达式
来自包含或表达式:
包含或表达式:
- 异或表达式
- 包含或表达式 | 异或表达式
接下来,异或表达式
异或表达式:
- 与表达式
- 异或表达式 ^ 与表达式
现在到and 表达式
与表达式:
- 平等表达
- 与表达式和相等表达式
来自关系运算符
等式表达式:
- 关系表达式
- 等式表达式 == 关系表达式
- 等式表达式 != 关系表达式
接下来来自关系表达式
关系表达式:
- 比较表达式
- 关系表达式 < 比较表达式
- 关系表达式 > 比较表达式
- 关系表达式 <= 比较表达式
- 关系表达式 >= 比较表达式
比较表达式旁边
比较表达式:
- 移位表达式
- 比较表达式 <=> 移位表达式
紧接着shift表达式
移位表达式:
- 加法表达
- 移位表达式 << 加法表达式
- 移位表达式 >> 加法表达式
下一个加法表达式
加法表达式:
- 乘法表达式
- 加法表达式 + 乘法表达式
- 加法表达式 - 乘法表达式
乘法表达式旁边
乘法表达式:
- pm-表达
- 乘法表达式 * pm 表达式
- 乘法表达式 / pm 表达式
- 乘法表达式 % pm 表达式
pm-表达式旁边
pm-表达式:
- 强制转换表达式
- pm-表达式 .* 转换表达式
- pm-表达式 ->* 强制转换表达式
强制转换表达式:
- 一元表达式
- ( type-id ) 强制转换表达式
一元表达式旁边
一元表达式:
- 后缀表达式
- 一元运算符强制转换表达式
- ++ 转换表达式
- -- 强制转换表达式
- 等待表达式
- 一元表达式的大小
- sizeof ( 类型 ID )
- sizeof ...(标识符)
- 对齐(类型ID)
- noexcept 表达式
- 新表达
- 删除表达式
最后我们到达后缀表达式
后缀表达式:
- 主要表达
- 后缀表达式 [ 表达式列表选项 ]
- 后缀表达式 ( expression-listopt )
- 简单类型说明符 ( expression-listopt )
- 类型名称说明符(表达式列表选项)
- 简单类型说明符花括号初始化列表
- 类型名称说明符花括号初始化列表
- 后缀表达式。templateopt id 表达式
- 后缀表达式 -> templateopt id 表达式
- 后缀表达式 ++
- 后缀表达式 --
- Dynamic_cast < 类型 ID > ( 表达式 )
- static_cast < 类型 ID > ( 表达式 )
- reinterpret_cast < 类型 ID > ( 表达式 )
- const_cast < 类型 ID > ( 表达式 )
- 类型ID(表达式)
- typeid ( 类型 ID )