c++ - 为什么除了继承聚合结构之外的结构不是空的,可以聚合初始化?
问题描述
考虑以下代码:
struct A {
int x;
double y;
};
struct B : public A {};
int main() {
A a {1, 2.3}; // (*)
B b {1, 2.3}; // (**)
}
行(*)
编译,行(**)
不编译。
这是因为 B 不被视为“聚合类型”吗?如果是这样,为什么不呢?如果不是,那么它不能以这种方式构建的原因是什么?
解决方案
GCC 10 的默认语言版本是 C++14。在 C++14 和之前的版本中,聚合不能有任何基类。
原因?没有很好的理由。所以,从 C++17 开始,这个规则就放宽了;现在没有聚合可以没有虚拟、私有或受保护的基类……但其他的都很好。
您的代码在 C++17 中运行。添加-std=c++17
到您的编译命令。
这些规则之前已针对 C++14 进行了修改;请务必在提问时指定您感兴趣的语言版本。
推荐阅读
- amazon-web-services - 带有 p2 实例的 AWS DLAMI 中的 Nvidia Docker 安装错误
- linux - 如何使用键盘快捷键与后台命令一起运行选定的文本?
- javascript - 使用 React 和 Node js 的文件共享网络应用程序
- stylecop - .net Core 2.0 中 Stylecop 的自定义规则
- python - 袖扣的坐标轴问题
- html - 移动设备中的引导导航栏丢失格式
- python - 我可以使用 pandas 分类变量作为 statsmodels 公式的左侧吗?
- regex - 如何在 Angular 4 打字稿上导入 RegExp
- powershell - 添加到数组中的一个元素会导致添加到所有元素
- wordpress - 将 URL 从子文件夹重定向到根目录