C++ 初始化列表对基类有效吗?

C++ 初始化列表对基类有效吗?,c++,initializer-list,C++,Initializer List,初始化列表对基类有效吗?如果是,怎么做?比如说 struct A { int i; }; struct B : public A { double d; }; int main() { B b{ A(10), 3.4 }; return 0; } struct A { int i; }; struct B : public A { B( int x, double d ) : A { x }, d( d ) {} double d

初始化列表对基类有效吗?如果是,怎么做?比如说

struct A
{
    int i;
};

struct B : public A
{
    double d;
};


int main()
{
    B b{ A(10), 3.4 };
    return 0;
}
struct A
{
    int i;
};

struct B : public A
{
    B( int x, double d ) : A { x }, d( d ) {}
    double d;
};

B b { 1, 2.0 };

结构B不是聚合类型。因此,您可能不会以这种方式使用带括号的init列表

然而,如果您要在类B中定义一个构造函数,那么您可以编写例如

struct A
{
    int i;
};

struct B : public A
{
    double d;
};


int main()
{
    B b{ A(10), 3.4 };
    return 0;
}
struct A
{
    int i;
};

struct B : public A
{
    B( int x, double d ) : A { x }, d( d ) {}
    double d;
};

B b { 1, 2.0 };

本标准第§8.5.1节定义了骨料:

聚合是没有提供用户的数组或类(第9条) 构造函数(12.1),对于非静态 数据成员(9.2),无私有或受保护的非静态数据成员 (第11条),没有基类(第10条),也没有虚函数 (10.3)

因为
B
有一个基类,所以它不是聚合:您不能在这里使用聚合括号初始化

编辑:

但是,您可以提供一个构造函数使大括号初始化工作(但它仍然不是聚合初始化):


是否有任何理由不在构造函数中使用初始值设定项列表?