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

时间:2012-11-16 19:19:24

标签: c++ c++11 list-initialization

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

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

    return 0;
}

代码由VC ++ 2012编译(最新更新“2012年11月CTP”)。

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

为什么?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

请注意,这个答案有轻微的重写,将最终结果改为与之前相反的结果。感谢@ David Rodríguez - dribeas让我很有启发。 :)功能

这是一个错误。 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

  

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

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