如果继承,则无法使用初始化列表初始化结构?

时间:2015-12-11 19:29:35

标签: c++ inheritance struct aggregate-initialization

我对这段(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不再用初始化程序初始化名单。我改变的只是让它从一个完全空的类继承 - 我想我以某种方式让它表现得更像结构。

我的编译器究竟如何处理结构CD

3 个答案:

答案 0 :(得分:4)

适用于C,因为它是aggregate,因此它使用aggregate initializationD不是聚合,因为它有一个基类。你提到的显而易见的解决方法是编写一个构造函数。

草案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
}

Live Example

答案 2 :(得分:-1)

struct c是POD,而struct D是一个对象。由于继承,类初始化程序规则适用。