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)**
对于本文的其余部分,我将引用一个"语言构造,该构造被定义为产生函数的隐式调用"简单地说是"构建"。
我有几个与引用段落相关的问题:
为什么会提到这段话(" ,而不是完整表达的一部分")?我能想到的唯一原因是:"构建" 包含表达式(真实表达式,而不是本段中使用的定义,它考虑"构造"作为表达式),否则,将被视为完整表达式或& #34;构造" 包含另一个"构造",类似地,它本身将被视为完整表达式。这些原因是否正确?如果是这样,我会很感激一些具体的例子。
"构造的一些例子"?我知道对象的初始化可能是一个(因为对构造函数的隐式调用),但是段落的第三个点(" 一个init-declarator([dcl.decl]))明确地将其视为完整表达式。此外,使用 new 运算符意味着隐式调用两个函数(一个用于分配空间,然后是构造函数),但新表达式是一个表达式。
为什么构造:" S s1(1)"是不是说full-expression是对构造函数的调用" S :: S(int)"?为什么不是构造本身的完整表达?