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之后就开始工作了,然后就可以在没有任何进一步帮助的情况下研究该更改的上下文。事实上,我就是这样回答这个问题的:注意,只花了四分钟