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

Can't initialize a struct using an initializer list if it inherits?

我对我写的这段 (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 不是更长的初始化列表。我所做的更改只是让它从一个完全空的 class 继承——我想我以某种方式让它表现得不那么像结构。

我的编译器究竟如何以不同方式处理结构 CD

它适用于 C,因为它是一个 aggregate and therefore it is using aggregate initialization,但 D 不是聚合,因为它有一个基数 class。您提到的明显解决方法是编写一个构造函数。

这包含在 C++ 标准草案 8.5.1 聚合 [dcl.init.aggr] 中,重点是我的:

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

有人提议:Extension to aggregate initialization 取消该限制。正如克里斯指出的那样,这已被进化工作组接受,但据我所知,现在也需要被 Core 接受。

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

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