C ++全表达标准措辞

时间:2017-08-17 20:44:07

标签: c++ language-lawyer standards

在当前(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

     

但是结果构造可能是对构造函数的函数调用,其中一个赋值表达式作为参数;再次,函数调用是一个完整表达式。 ]

这是相信第二种解释是预期的另一个理由。

我知道对语言的理解没有任何区别,但我只是想知道最初写该段的人的意图是什么。

0 个答案:

没有答案