3

我对我写的这段 (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

4

3 回答 3

4

它之所以有效C,是因为它是一个聚合,因此它使用聚合初始化,但D不是聚合,因为它有一个基类。正如您提到的,显而易见的解决方法是编写一个构造函数。

这在草案 C++ 标准部分8.5.1Aggregates [dcl.init.aggr]中有所介绍,重点是我的:

聚合是一个数组或类(第 9 条),没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第 11 条),没有基类(第 10 条),也没有虚函数(10.3 ) )。

有一个提议:扩展聚合初始化以消除该限制。正如克里斯指出的那样,这已被进化工作组接受,但据我所知,现在也需要被核心接受。

于 2015-12-11T19:31:35.400 回答
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

于 2015-12-11T19:31:52.680 回答
-1

struct c 是一个 POD,而 struct D 是一个对象。由于继承,类初始值设定项规则适用。

于 2015-12-11T19:33:22.263 回答