初始化列表是否适用于基类?如果是这样,怎么样?例如
struct A
{
int i;
};
struct B : public A
{
double d;
};
int main()
{
B b{ A(10), 3.4 };
return 0;
}
答案 0 :(得分:4)
标准的第8.5.1节定义了一个聚合:
聚合是一个没有用户提供的数组或类(第9条) 构造函数(12.1),非静态的支撑或等于初始化器 数据成员(9.2),没有私有或受保护的非静态数据成员 (第11条),没有基类(第10条),没有虚函数 (10.3)。
由于B
有一个基类,因此不是聚合:你不能在这里使用聚合大括号初始化。
编辑:
但是,你可以提供一个构造函数来进行大括号初始化工作(但它仍然是不聚合初始化):
struct A
{
int i;
};
struct B : public A
{
B(int i, double d) : A {i}, d(d) {}
double d;
};
int main()
{
B b { 10, 3.6 };
return 0;
}
答案 1 :(得分:2)
结构B不是聚合类型。所以你可能不会使用braced-init列表这样的方式。
但是如果要在B类中定义构造函数,那么可以编写例如
struct A
{
int i;
};
struct B : public A
{
B( int x, double d ) : A { x }, d( d ) {}
double d;
};
B b { 1, 2.0 };