C ++ 17全表达式标准定义

时间:2017-08-08 19:10:08

标签: c++ expression language-lawyer full-expression

来自C ++ 17标准草案的

This段落声明:

  

完整表达是:

     

- 未评估的操作数,

     

-a constant-expression([expr.const]),

     

-an init-declarator ([dcl.decl])或mem-initializer([class.base.init]),包括初始化程序的组成表达式,

     

- 调用在临时对象以外的对象的生命周期结束时生成的析构函数,或

     

- 表达式不是另一个表达式的子表达式,而不是完整表达式的一部分。

     

如果定义语言构造以产生函数的隐式调用,则语言构造的使用被认为是用于此定义的表达式。 [...]

struct S {

   S(int i): I(i) { }       // full-expression is initialization of I

   int& v() { return I; }
   ~S() noexcept(false) { }
private:
   int I;
};

S s1(1);                   // **full-expression is call of S​::​S(int)**

对于本文的其余部分,我将引用一个"语言构造,该构造被定义为产生函数的隐式调用"简单地说是"构建"。

我有几个与引用段落相关的问题:

  1. 为什么会提到这段话(" ,而不是完整表达的一部分")?我能想到的唯一原因是:"构建" 包含表达式(真实表达式,而不是本段中使用的定义,它考虑"构造"作为表达式),否则,将被视为完整表达式或& #34;构造" 包含另一个"构造",类似地,它本身将被视为完整表达式。这些原因是否正确?如果是这样,我会很感激一些具体的例子。

  2. "构造的一些例子"?我知道对象的初始化可能是一个(因为对构造函数的隐式调用),但是段落的第三个点(" 一个init-declarator([dcl.decl]))明确地将其视为完整表达式。此外,使用 new 运算符意味着隐式调用两个函数(一个用于分配空间,然后是构造函数),但新表达式是一个表达式。

  3. 为什么构造:" S s1(1)"是不是说full-expression是对构造函数的调用" S :: S(int)"?为什么不是构造本身的完整表达?

0 个答案:

没有答案