为什么不能将简单派生的类视为聚合类型?
Why can't a trivially derived class be treated as an aggregate type?
来自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的目标之一是"让语言更容易教和学",因此不能掉以轻心。当然,我意识到不会有歧义,这就是为什么我避免使用这个词,它只是没有一个每个人都必须立即正确假设的顺序。
我想我的观点是,允许基类几乎没有什么好处,这可能会导致混乱。可能需要在标准中谨慎措辞才能允许这样做。
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 为什么 int 类型的枚举类值不能用作 int
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 类型为 "Bucket&"(未限定的 const 限定)的引用不能使用 "SortedList." 类型的值进行初始化 如何修复此错误?
- 为什么模板引用类型不能用作模板类型别名参数?
- 函数指针类型不能用于函数原型
- 为什么静态大小数组类型不能是容器类型
- 具有返回类型的函数模板,该返回类型不能从参数中推导出来
- 递归提升::变量类型不能用"-std=c++11 -stdlib=libc++"编译
- std::is_trivially_copyable - 为什么易失性标量类型不能轻易复制
- CV 合格类型不能转换为 CV 不合格类型
- 枚举类型不能接受 CIN 命令
- 在c++程序中,哪种数据类型不能作为异常抛出
- 为什么自动类型不能与c++语句中的其他内置类型共存
- Auto it = vector.begin()结果类型不能转换为const_iterator
- 为什么boost::fusion序列中的struct数组成员类型不能正确推导
- 强制std::map的键类型不能为const