6

根据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{ }) 之前将专门提供继承构造函数的类类型初始化为零?

4

1 回答 1

6

正确答案是0因为默认构造函数 forB是隐式声明的。

请注意,默认、复制和移动构造函数不是继承的;引用§12.9/3 [class.inhctor]

对于候选继承构造函数集中的每个非模板构造函数,除了没有参数的构造函数或具有单个参数的复制/移动构造函数之外,构造函数被隐式声明为具有相同的构造函数特征,除非存在用户声明的构造函数使用声明出现的完整类中的相同签名或构造函数将是该类的默认、复制或移动构造函数。


您的示例类似于 N3797, §12.9/6中列出的示例(为简洁而编辑)

struct B2 {
  B2(int = 13, int = 42);
};

struct D2 : B2 {
  using B2::B2;
};

D2for 中 的 候选继承构造函数 集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),隐式声明的继承构造函数

在您的情况下,Bfor中的候选继承构造函数集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
于 2013-11-28T00:37:08.210 回答