如果继承,则无法使用初始化列表初始化结构?
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 继承——我想我以某种方式让它表现得不那么像结构。
我的编译器究竟如何以不同方式处理结构 C
和 D
?
它适用于 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
}
struct c 是一个 POD 而 struct D 是一个对象。 Class 由于继承,初始化程序规则适用。
我对我写的这段 (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 继承——我想我以某种方式让它表现得不那么像结构。
我的编译器究竟如何以不同方式处理结构 C
和 D
?
它适用于 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
}
struct c 是一个 POD 而 struct D 是一个对象。 Class 由于继承,初始化程序规则适用。