我对这段(C ++ 14)我编写的代码感到困惑:
struct B {};
struct C { int m; };
struct D : B { int m; };
int main() {
C c = { 1 }; // this works
D d = { 1 }; // this doesn't work
}
我自己很好地为D
编写了一个构造函数,但是我找不到一个很好的解释为什么结构D
不再用初始化程序初始化名单。我改变的只是让它从一个完全空的类继承 - 我想我以某种方式让它表现得更像结构。
我的编译器究竟如何处理结构C
和D
?
答案 0 :(得分:4)
适用于C
,因为它是aggregate,因此它使用aggregate initialization但D
不是聚合,因为它有一个基类。你提到的显而易见的解决方法是编写一个构造函数。
草案C ++标准部分8.5.1
汇总了 [dcl.init.aggr] ,重点是我的:
聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有私有或者 受保护的非静态数据成员(第11条),无基类(第10条),没有虚函数(10.3)。
有一项提案:Extension to aggregate initialization删除该限制。正如克里斯指出的那样,这已被Evolution工作组接受,但据我所知,现在也需要被Core接受。
答案 1 :(得分:3)
D
不再是聚合类型,因此无法使用初始化列表直接初始化它。如果您提供构造函数,那么它将起作用。
struct B {};
struct C { int m; };
struct D : B { int m; D(int m_) : m(m_) {} };
int main()
{
C c = { 1 }; // this works
D d = { 1 }; // this works
}
答案 2 :(得分:-1)
struct c是POD,而struct D是一个对象。由于继承,类初始化程序规则适用。