在当前(C ++ 17)C ++标准草案的[intro.execution]的paragraph 12中写道:
完整表达式是:
[...]
- 一个表达式,它不是另一个表达式的子表达式,而不是完整表达式的一部分。
如果定义语言构造以产生函数的隐式调用,则语言构造的被认为是用于此定义的表达式。 [...]
“语言结构的使用”措辞指的是构造本身被视为表达式或构造“使用”的隐式调用被视为表达式的事实吗?
我问这个是因为在同一段落中有这个代码示例:
S s1(1); // full-expression is call of S::S(int)
评论表明第二种解释是正确的。
然而,该段明确指出 init-declarator 是完整表达式,这表明评论是错误的。
在过去(我相信甚至在C ++ 03之前),这段看起来像这样(取自this defect report):
full-expression是一个表达式,它不是另一个表达式的子表达式。如果定义语言构造以产生函数的隐式调用,则语言构造的使用被认为是用于此定义的表达式。
[注意:C ++中的某些上下文会导致评估由表达式以外的句法结构(5.19 [expr.comma])产生的完整表达式。例如,在8.6 [dcl.init]中,初始化程序的一种语法是
(表达式列表)
但是结果构造是对构造函数的函数调用,其中expression-list作为参数列表; 这样的函数调用是一个完整表达式。例如,在8.6 [dcl.init]中,初始化程序的另一种语法是
= initializer-clause
但是结果构造可能是对构造函数的函数调用,其中一个赋值表达式作为参数;再次,函数调用是一个完整表达式。 ]
这是相信第二种解释是预期的另一个理由。
我知道对语言的理解没有任何区别,但我只是想知道最初写该段的人的意图是什么。