有没有办法使用初始化列表来初始化Bar?
struct Foo {
int i[2];
};
struct Bar : Foo {};
Foo f{0, 1}; // OK
Bar b{0, 1}; // error: no matching function for call to
// ‘Bar::Bar(< brace-enclosed initializer list>)’
答案 0 :(得分:4)
Foo
是一个聚合,可以使用执行聚合初始化的括号列表来初始化聚合。这就是为什么即使没有构造函数也可以使用Foo
初始化{0, 1}
。
但是,Bar
是否也是聚合,取决于您使用的C ++版本。在C ++ 14及更早版本中,聚合不能具有基类,因此Bar
不是聚合。因此,无法使用聚合初始化对其进行初始化,并且需要适当的构造函数。 [Live example]
在C ++ 17中,&#34;聚合&#34;的定义扩展到包含非虚拟公共基类的类,所以在C ++ 17中,Bar
是聚合,实际上,可以使用进行初始化汇总初始化:[Live example]
答案 1 :(得分:2)
由于Foo
是一种聚合类型,它通过aggregate initialization
进行初始化,从c ++ 14开始不支持基类初始化。但好消息是它将在c ++ 17中得到支持:)
取自cppreference的示例:
// aggregate
struct base1 { int b1, b2 = 42; };
// non-aggregate
struct base2 {
base2() : b3(42) {}
int b3;
};
// aggregate in C++17
struct derived : base1, base2 { int d; };
derived d1{ {1, 2}, { }, 4}; // d1.b1 = 1, d1.b2 = 2, d1.b3 = 42, d1.d = 4
derived d2{ { }, { }, 4}; // d2.b1 = 0, d2.b2 = 42, d2.b3 = 42, d2.d = 4
答案 2 :(得分:1)
它编译,但使用C ++ 17聚合可以有基类。这允许基本数据成员的列表初始化。请点击此处了解更多信息:
http://en.cppreference.com/w/cpp/language/aggregate_initialization
聚合初始化的影响是:
每个直接公共基础,(自C ++ 17)数组元素 ,或非静态类成员,按数组下标/外观的顺序 类定义,是从相应的子句复制初始化的 初始化列表。