1 回答
TA贡献1860条经验 获得超9个赞
在具有类内成员初始化程序的C ++ 11中,结构/类不是聚合的-但是在C ++ 14中已更改。当我第一次遇到它时,我感到很惊讶,这种限制的理由是,类内初始化器与用户定义的构造函数非常相似,但是计数器参数是没有人真正期望添加类内初始化器可以使他们的班级/结构非聚集,我肯定没有。
在C ++ 11标准草案的“ 8.5.1 聚合”部分(重点是我的工作):
集合是一个数组或一个类(第9章),没有用户提供的构造函数(12.1),没有针对非静态数据成员的括号或相等的初始化程序(9.2),没有私有或受保护的非静态数据成员(条款11),没有基类(条款10)和虚拟函数(10.3)。
在C ++ 14中,同一段内容为:
聚合是没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第11章),没有基类(第10章)以及没有虚函数(10.3)的数组或类(第9章) )。
这种变化是覆盖在N3605:成员初始化和骨料它具有以下摘要:
Bjarne Stroustrup和Richard Smith提出了一个关于聚合初始化和成员初始化器无法协同工作的问题。本文建议采用Smith提出的措辞来解决此问题,该措辞消除了聚合不能具有成员初始化程序的限制。
该评论基本上总结了不愿允许它们聚合的想法:
聚合不能具有用户定义的构造函数,而 成员初始化器本质上是某种用户定义的构造函数(元素)(另请参见Core Defect 886)。我不反对这种扩展,但是它对我们的聚合模型实际上是有影响的。接受此扩展后,我想知道如何教授什么是聚合。
修订版N3653于2013年5月通过。
更新资料
emsr指出,G ++ 5.0现在支持使用std=c++1y或使用非静态数据成员初始化程序的C ++ 14聚合-std=c++14:
struct A { int i, j = i; };
A a = { 42 }; // a.j is also 42
看到它实时运行。
- 1 回答
- 0 关注
- 348 浏览
添加回答
举报