为什么不能将简单派生的类视为聚合类型?

Why can't a trivially derived class be treated as an aggregate type?

本文关键字:类型 不能 简单 派生 为什么      更新时间:2023-10-16

来自C++标准草案n3337:

8.5.1骨料[dcl.init.agr]

1聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有用于非静态数据成员的大括号或等号(9.2),没有私有或受保护的非静态数据元素(第11条),无基类(第10条),也无虚拟函数(10.3)

假设我有两个班:

struct ABase
{
   int value;
};
struct A : public ABase {};

根据标准,ABase是聚合类型,而A不是。这意味着,可以使用创建ABase的实例

ABase a1{10};

但是使用创建A的实例是不可行的

A a2{20};

CCD_ 5是由CCD_。我的问题是,作为语言的用户和编译器的实现者,将A视为聚合类型会遇到什么样的陷阱?

显然,我的声誉不允许我发表评论,我不确定是否可以发表评论,因为这可能被解释为主观的,但"该语言的用户"可能会觉得这个概念很麻烦。

初始化顺序。如果一个类既有作为基的聚合,也有作为非静态数据成员的聚合,那么它们的初始化顺序是什么?非静态数据成员之前的基类?当然,当基类有基类或有多个基类时,情况如何。当然还有虚拟继承等。对于新手程序员来说,构造函数mem初始值设定项列表中的类成员是按照声明顺序而不是列表顺序初始化的,这甚至可能会让他们感到惊讶。我认为,允许进一步混淆初始化(在聚合的情况下)会使语言更难学习。Bjarne Stroustrup列出的C++11的目标之一是"让语言更容易教和学",因此不能掉以轻心。当然,我意识到不会有歧义,这就是为什么我避免使用这个词,它只是没有一个每个人都必须立即正确假设的顺序。

我想我的观点是,允许基类几乎没有什么好处,这可能会导致混乱。可能需要在标准中谨慎措辞才能允许这样做。