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

use*_*020 5 c++ initializer-list

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

struct A
{
    int i;
};

struct B : public A
{
    double d;
};


int main()
{
    B b{ A(10), 3.4 };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

qua*_*dev 4

标准的 \xc2\xa7 8.5.1 节定义了一个聚合:

\n\n
\n

聚合是一个数组或类(第 9 条),没有用户提供的构造函数 (12.1),没有非静态数据成员的大括号或等于初始化器 (9.2),没有私有或受保护的非静态数据成员(第 11 条),无基类(第 10 条),并且无虚函数(10.3)。

\n
\n\n

由于B有基类,因此不是聚合:您不能在此处使用聚合大括号初始化。

\n\n

编辑 :

\n\n

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

\n\n
struct A\n{\n    int i;\n};\n\nstruct B : public A\n{\n    B(int i, double d) : A {i}, d(d) {}\n    double d;\n};\n\n\nint main()\n{\n    B b { 10, 3.6 };\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n