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

比基涅耶夫

标准中是否允许:

struct A
{
  int a = 3;
  int b = 3;
};

A a{0,1}; // ???

此类仍在汇总吗?clang接受此代码,但gcc接受

沙菲克·雅格慕(Shafik Yaghmour)

在具有类内成员初始化程序的C ++ 11中,结构/类不是聚合的-但是,这在C ++ 14中已更改。当我第一次遇到它时,我感到很惊讶,这种限制的理由是,类内初始化器与用户定义的构造函数非常相似,但counter参数是没有人真正期望添加类内初始化器可以使他们的班级/结构非聚集,我肯定没有。

草案C ++ 11标准的部分8.5.1 骨料重点矿山前进):

集合是一个数组或一个类(第9章),没有用户提供的构造函数(12.1),没有用于非静态数据成员的大括号或相等的初始化程序(9.2),没有私有或受保护的非静态数据成员(Clause) 11),没有基类(条款10)和虚拟函数(10.3)。

C ++ 14中,同一段内容为:

聚合是没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第11章),没有基类(第10章)和没有虚函数(10.3)的数组或类(第9章)。 )。

N3605:成员初始化器和聚合包含以下更改

Bjarne Stroustrup和Richard Smith提出了一个关于聚合初始化和成员初始化器无法协同工作的问题。本文建议采用Smith提出的措辞来解决此问题,该措辞消除了聚合不能具有成员初始化程序的限制

该评论基本上总结了不愿意将它们汇总的想法:

聚合不能具有用户定义的构造函数,而成员初始化器本质上是某种用户定义的构造函数(元素)(另请参见Core Defect 886)。我不反对这种扩展,但是它对我们的聚合模型实际上是有影响的。接受此扩展后,我想知道如何教授什么是聚合。

修订版N365320135月通过

更新资料

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

看到它实时运行

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章