3

C++ 17 标准草案中的这一段指出:

一个完整的表达式是:

- 未计算的操作数,

-一个常量表达式([expr.const]),

-一个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. 为什么提到这段(“并且那不是完整表达式的一部分”)?我能想到的唯一原因是:一个“构造”包含一个表达式(真正的表达式,而不是本段中使用的定义,它将“构造”视为表达式),否则将被视为完整表达式或“construct”包含另一个“construct”,同样,它本身将被视为完整表达式。这些理由正确吗?如果是这样,我将不胜感激一些具体的例子。

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

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

4

0 回答 0