初始化表达式怎么可能是语法中的“赋值表达式”?

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();赋值表达式

use*_*570 5

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 )