需要对C++ 11标准中的8.5.p7进行一些澄清

Bel*_*loc 12 c++ initialization c++11

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

对值类型T的对象进行值初始化意味着:

  • 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的) ;

  • 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的,如果T的隐式声明的默认构造函数是非平凡的,则调用该构造函数.

  • 如果T是数组类型,那么每个元素都是值初始化的;

  • 否则,该对象被零初始化.

我有一个问题,理解上面的粗体字符.附加调用T的隐式默认构造函数如何改变零初始化,这种情况刚刚发生?

Chr*_*odd 16

这是一个具体的例子:

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

class B {
    int b;
    A c;
};
Run Code Online (Sandbox Code Playgroud)

B属于这一类 - 它是一个没有用户提供的构造函数的非联合类类型.因此,如果一个B是值初始化时,它将首先是零初始化(因此两者bc.a将被设置为0),然后将默认的构造将被调用(这将调用A的构造和设置c.a为1).

根据as-if规则,优化器可以将这些组合成一个步骤(将设置b为0和c.a1),因为没有人能够看到零初始化和默认构造函数之间的对象.


Igo*_*nik 5

T可能没有自己的显式默认构造函数,但它可能源自U那个,和/或具有类类型的成员V.