具有独占继承构造函数的类的值初始化
Value initialization for classes with exclusively inherited constructors
根据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
,因为B
的默认构造函数是隐式声明的。
请注意,默认情况下,复制&move构造函数不是继承的;引用§12.9/3[class.inctor]
对于继承构造函数的候选集合中除构造函数之外的每个非模板构造函数没有参数或复制/移动构造函数只有一个参数,构造函数是隐式的使用相同的构造函数特性声明,除非存在具有相同构造函数特性的用户声明构造函数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&&)
并且CCD_ 19中存在的构造函数是
B() implicitly declared, not inherited
B(int) implicitly declared, inherited
B(const& B) implicitly declared, not inherited
B(B&&) implicitly declared, not inherited
- 为什么std::vector和std::valarray初始化构造函数不同
- 初始化构造函数C++中结构的向量
- C++ 中常量属性的初始化构造函数错误
- 不正确的输出和变量未用Eclipse CDT初始化构造函数
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- 如何通过参数初始化构造函数中的数组?
- 是否有理由使用 malloc 初始化构造函数中的指针
- 如何在 c++ 中初始化构造函数中的二维数组
- 为什么初始化构造函数列表参数时会发生异常?
- 无法初始化构造函数
- 初始化构造函数的默认参数的优选方法是什么?
- 在C++17中使用空列表初始化构造函数时发生编译错误
- C++ 初始化构造函数初始化列表中的嵌套结构?
- 初始化构造函数c++中的向量
- g++ (GCC) 4.6.0 我有以下类,我正在尝试初始化构造函数的结构成员初始化列表
- 使用字符串文本初始化构造函数中的 std::array<char,x> 成员。海湾合作委员会错误?
- 初始化构造函数C++中函数的成员指针
- 在c++中初始化构造函数中的静态成员变量时出错
- memset()初始化构造函数中的对象
- 初始化构造函数C++中的成员向量