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未初始化.
为什么?
你的意思是微软的社区技术预览版编译器,他们甚至没有足够的信心把它称为测试版,它有错误吗?;)
这是一个错误; 它应该像你期望的那样表现.请报告.
请注意,这个答案有一个轻微的重写,将最终结果改为与之前相反的结果.感谢@ DavidRodríguez -启发我的动力.:)
这是一个错误.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
if
T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的[...]
而这反过来意味着成员应该被清零.