C++ 11标准的8.5p7段规定:



我在理解上面粗体字时遇到问题。 T的隐式默认构造函数的附加调用如何改变这种情况下刚刚发生的零初始化?

最佳答案

这是一个具体的例子:

class A {
    int a;
public:
    A() : a(1) {}
};

class B {
    int b;
    A c;
};
B属于此类别-它是不具有用户提供的构造函数的非 union 类类型。因此,如果将B初始化为值,则首先将其初始化为零(因此bc.a都将设置为0),然后将调用默认构造函数(它将调用A的构造函数并将c.a设置为1 )。

根据as-if规则,优化程序可以将这些步骤组合为一个步骤(它将b设置为0并将c.a设置为1),因为在零初始化和默认构造函数之间谁也看不到对象。

10-05 18:13