首页 > 解决方案 > 为什么除了继承聚合结构之外的结构不是空的,可以聚合初始化?

问题描述

考虑以下代码:

struct A {
    int x;
    double y;
};

struct B : public A {};

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

(*)编译,行(**) 编译。

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

标签: c++inheritancestructaggregate-initializationaggregate-type

解决方案


GCC 10 的默认语言版本是 C++14。在 C++14 和之前的版本中,聚合不能有任何基类。

原因?没有很好的理由。所以,从 C++17 开始,这个规则就放宽了;现在没有聚合可以没有虚拟、私有或受保护的基类……但其他的都很好。

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


这些规则之前已针对 C++14 进行了修改;请务必在提问时指定您感兴趣的语言版本。


推荐阅读