struct A
{
private:
int a, b, c;
};
int main()
{
A a1{};
A a2 = {};
return 0;
}
代码由VC ++ 2012编译(最新更新“2012年11月CTP”)。
我希望a1和a2是零初始化的,但不是。 a1和a2未初始化。
为什么?
答案 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条),没有私有或受保护的非静态数据成员[...]
这只会留下列表初始化,并且会对a1
和a2
进行初始化。
§8.5.1 [dcl.init.list] p3
类型
T
的对象或引用的列表初始化定义如下:
- 如果初始化列表没有元素且
T
是具有默认构造函数的类类型,则该对象是值初始化的。
对于我们的特定情况,值初始化指定如下:
§8.5 [dcl.init] p7
如果
T
是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的[...]
这反过来意味着成员应该被清零。