列表初始化不能用于私有成员吗?

xml*_*lmx 5 c++ c++11 list-initialization

struct A
{
private:
    int a, b, c;
};

int main()
{
    A a1{};
    A a2 = {};

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该代码由VC++ 2012编译(最新更新"2012年11月CTP").

我希望a1和a2是零初始化的,但不是.a1和a2未初始化.

为什么?

Nic*_*las 7

你的意思是微软的社区技术预览版编译器,他们甚至没有足够的信心把它称为测试版,它有错误吗?;)

这是一个错误; 它应该像你期望的那样表现.请报告.

  • 你确定吗?成员是`private`,这意味着该类型不是聚合,这反过来意味着语法表示对隐式声明的默认构造函数的调用.隐式定义的默认构造函数不初始化POD成员,这意味着不应该初始化`a`,`b`,`c`.或者我错过了什么? (3认同)
  • 实际上无视我的最后评论,**这个答案是正确的**.问题中的语法是*list-initialization*,在这种情况下映射到*value-initialization*,在这种情况下,这意味着*零初始化*.+1 (3认同)

Xeo*_*Xeo 6

请注意,这个答案有一个轻微的重写,将最终结果改为与之前相反的结果.感谢@ DavidRodríguez -启发我的动力.:)

这是一个错误.Clang 3.2 trunk和GCC 4.7+也同意并且会对成员进行零初始化.

一些标准的时间.请注意,T x{};(或= {})可以解释为列表初始化聚合初始化.A这里不是聚合,因为它有私有成员,因此不能由后者初始化.

§8.5.1 [dcl.init.aggr] p1

聚集体是与阵列或类(第9节)[...]没有私有或保护的非静态数据成员[...]

这只是叶列表初始化,这将值初始化都a1a2.

§8.5.1 [dcl.init.list] p3

对象或类型引用的列表初始化T定义如下:

  • 如果初始化列表没有元素并且T是具有默认构造函数的类类型,则对象将进行值初始化.

对于我们的特定情况,值初始化指定如下:

§8.5 [dcl.init] p7

if T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的[...]

而这反过来意味着成员应该被清零.

  • @damienh:是的,这正是原因所在.如果没有用户定义的构造函数,*zero-initialization*将处理对象的POD子成员,而*隐式定义的默认构造函数*将负责具有用户定义的构造函数的成员.你需要两者. - 谢谢,我认为你不应该**得到答案,它有有效的数据可以增加价值.你只需要纠正最后一部分(我将upvote,给我一个评论,我将清除所有不再适用的评论:) (2认同)