Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';如果结构继承,是否使用初始值设定项列表初始化结构?_C++_Inheritance_Struct_Aggregate Initialization - Fatal编程技术网

C++ Can';如果结构继承,是否使用初始值设定项列表初始化结构?

C++ Can';如果结构继承,是否使用初始值设定项列表初始化结构?,c++,inheritance,struct,aggregate-initialization,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不再可以使用初始值设定项列表进行初始化。我所做的更改是使它从一个完全空的类继承—

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

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

<>这是在C++标准部分草案>代码> 8.5.1>代码>集合[DCL,init,AGGR ]中强调的: 聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),也没有私有或非私有构造函数 受保护的非静态数据成员(第11条),无基类(第10条),无虚拟函数(10.3)


有一个建议:取消这一限制。正如chris指出的,这一点已被Evolution工作组接受,但据我所知,现在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
}

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

C
也是和object。根据,科纳接受了该提案。@克里斯我没有看到对最新草案的修改,所以我不确定,尽管我记得我读过旅行报告,它被接受了。@chris好的,现在我明白了。据我所知,EWG已经接受了它。在将其应用于标准草案之前,它现在必须提交给CWG。