初始化列表是否适用于基类?

时间:2014-06-23 17:51:43

标签: c++ initializer-list

初始化列表是否适用于基类?如果是这样,怎么样?例如

struct A
{
    int i;
};

struct B : public A
{
    double d;
};


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

2 个答案:

答案 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 };