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是值初始化时,它将首先是零初始化(因此两者b和c.a将被设置为0),然后将默认的构造将被调用(这将调用A的构造和设置c.a为1).
根据as-if规则,优化器可以将这些组合成一个步骤(将设置b为0和c.a1),因为没有人能够看到零初始化和默认构造函数之间的对象.