根据cppreference,没有任何用户提供的构造函数的非联合类类型在构造之前将被初始化为零:
如果T是没有任何用户提供的构造函数的非联合类类型,则该对象被零初始化,然后调用隐式声明的默认构造函数(除非它是微不足道的)
我不确定当使用c ++ 11继承的构造函数时会发生什么,因为引用明确提到了隐式声明的默认构造函数。
给出以下示例:
#include <iostream>
struct A {
int a;
A() {}
A(int i): a(i) {}
};
struct B: public A {
using A::A;
};
int main() {
B b { 5 };
B* p = new (&b) B{ };
std::cout << b.a << std::endl;
}
正确的输出是0还是5?在值初始化(B{ }
)之前,是否应该专门提供继承构造函数的类类型进行零初始化?
答案 0 :(得分:6)
正确答案是0
,因为B
的默认构造函数是隐式声明的。
请注意默认,复制和放大移动构造函数不是继承的;引自§12.9/ 3 [class.inhctor]
对于继承构造函数的候选集中的每个非模板构造函数,而不是构造函数 没有参数或具有单个参数的复制/移动构造函数,构造函数是隐式的 声明具有相同的构造函数特征,除非有一个用户声明的构造函数具有相同的构造函数 完整类中的签名,其中出现using声明或构造函数是默认值, 复制或移动该类的构造函数。
您的示例类似于N3797中列出的示例,§12.9/ 6 (为简洁起见而编辑)
struct B2 {
B2(int = 13, int = 42);
};
struct D2 : B2 {
using B2::B2;
};
D2
B2
中的候选继承构造函数集为
-B2(const B2&)
-B2(B2&&)
-B2(int = 13, int = 42)
-B2(int = 13)
-B2()
D2
中的构造函数集是
-D2()
,隐式声明的默认构造函数,不是继承的 -D2(const D2&)
,隐式声明的复制构造函数,不是继承的 -D2(D2&&)
,隐式声明的移动构造函数,不是继承的 -D2(int, int)
,隐式声明的继承构造函数
-D2(int)
,隐式声明的继承构造函数
在您的情况下,B
A
中的候选继承构造函数集是
A()
A(int)
A(const& A)
A(A&&)
和B
中的构造函数是
B() implicitly declared, not inherited
B(int) implicitly declared, inherited
B(const& B) implicitly declared, not inherited
B(B&&) implicitly declared, not inherited