为什么可以';普通派生类不能被视为聚合类型吗? < C++草案标准:

为什么可以';普通派生类不能被视为聚合类型吗? < C++草案标准:,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,8.5.1骨料[dcl.初始骨料] 1聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有用于非静态数据成员的大括号或等式化器(9.2),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),也没有虚拟函数(10.3) 假设我有两门课: struct ABase { int value; }; struct A : public ABase {}; 根据标准,ABase是聚合类型,而A不是。这意味着,可以使用以下方法创建ABase的实例: ABase a

8.5.1骨料[dcl.初始骨料]

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 a2{20};
但是使用以下方法创建
A
的实例是不合适的:

ABase a1{10};
A a2{20};

A
是从
ABase
派生出来的,可能被视为聚合。我的问题是,如果将
a
视为聚合类型,无论是语言用户还是编译器的实现者,都会遇到什么样的陷阱?

显然,我的声誉不允许我发表评论,我不确定发表评论是否合适,因为它可能被解释为主观的,但这是一个原因“语言使用者”可能会觉得这个概念很麻烦

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


我想我的观点是,允许基类所带来的好处微乎其微,这可能会导致混乱。这可能需要在标准中谨慎地使用措辞来允许这一点。

初始值设定项语法可能会得到(甚至更多)很复杂,否则我想你有一个观点。你在问它应该怎么改成“没有基类或者所有基类都是聚合的”(如果是这样,我建议它可能是重复的。)ReMyabel[YaMaBe],是的,它是一个复制品。在你的例子中,你最好使用别名。我希望从熟悉C++标准开发过程的人那里得到一些答案。如果派生类添加非静态成员变量,你所说的话是有意义的。