为了账号安全,请及时绑定邮箱和手机立即绑定

请问具有非静态成员初始化程序的类的C ++ 11聚合初始化

请问具有非静态成员初始化程序的类的C ++ 11聚合初始化

C++
心有法竹 2019-11-04 11:24:49
标准中是否允许:struct A{  int a = 3;  int b = 3;};A a{0,1}; // ???此类仍在汇总吗? clang接受此代码,但gcc不接受。
查看完整描述

1 回答

?
慕码人2483693

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

看到它实时运行。



查看完整回答
反对 回复 2019-11-04
  • 1 回答
  • 0 关注
  • 348 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信