Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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++ 为什么不是';不是结构,空而不是继承聚合结构,聚合是否可初始化?_C++_Inheritance_Struct_Aggregate Initialization_Aggregate Type - Fatal编程技术网

C++ 为什么不是';不是结构,空而不是继承聚合结构,聚合是否可初始化?

C++ 为什么不是';不是结构,空而不是继承聚合结构,聚合是否可初始化?,c++,inheritance,struct,aggregate-initialization,aggregate-type,C++,Inheritance,Struct,Aggregate Initialization,Aggregate Type,考虑以下代码: struct A { int x; double y; }; struct B : public A {}; int main() { A a {1, 2.3}; // (*) B b {1, 2.3}; // (**) } 行(**)编译,行(**) 这是否因为B不被视为“聚合类型”?如果是,为什么不是呢?如果不是,它不能以这种方式构造的原因是什么?GCC10的默认语言版本是C++14。在C++14及更早版本中,任何聚合都不能有任何基类 原

考虑以下代码:

struct A {
    int x;
    double y;
};

struct B : public A {};

int main() {
    A a {1, 2.3}; // (*)
    B b {1, 2.3}; // (**)
}
(**)
编译,行
(**)


这是否因为B不被视为“聚合类型”?如果是,为什么不是呢?如果不是,它不能以这种方式构造的原因是什么?

GCC10的默认语言版本是C++14。在C++14及更早版本中,任何聚合都不能有任何基类

原因是什么?因此,从C++17开始,这个规则被放宽了;现在,任何聚合都不能没有虚拟、私有或受保护的基类……但其他的都可以

您的代码在C++17中工作。将
-std=c++17
添加到编译命令中。



这些规则已经生效;问问题时一定要指定您感兴趣的语言版本。

在c++17之前,有任何基类都意味着它不再是聚合。在c++17中,
public
基类是。这是解决问题的答案。@cigien答案部分@汤姆萨布利克:是的,我只是想强调一下。@swithwings本来是很公平的,但你已经把它涵盖了:)那么C++11呢?在这种情况下,C++11和C++14一样吗?@einpoklum有点离题,但正如链接的答案所示:是的。)我不会猜到这样的事情最近会发生变化,当它不涉及新的语言功能时——这就是为什么我没有提到标准版本的原因。@einpoklum最好不要猜测,而是总是在前面给出版本号,以避免来回:)同样对于这样的东西,我建议在各种语言版本上试用它;您很快就会注意到,这在C++17之后就开始工作了,然后就可以在没有任何进一步帮助的情况下研究该更改的上下文。事实上,我就是这样回答这个问题的:注意,只花了四分钟