struct A
{
private:
int a, b, c;
};
int main()
{
A a1{};
A a2 = {};
return 0;
}
该代码由 VC++ 2012 编译(最新更新“2012 年 11 月 CTP”)。
我希望 a1 和 a2 是零初始化的,但不是。a1 和 a2 未初始化。
为什么?
struct A
{
private:
int a, b, c;
};
int main()
{
A a1{};
A a2 = {};
return 0;
}
该代码由 VC++ 2012 编译(最新更新“2012 年 11 月 CTP”)。
我希望 a1 和 a2 是零初始化的,但不是。a1 和 a2 未初始化。
为什么?
你的意思是微软的社区技术预览编译器,他们甚至没有足够的信心称之为beta,它有错误吗?;)
这是一个错误;它应该按照您的预期运行。请这样报告。
请注意,此答案略有改写,最终结果与以前相反。感谢@David Rodríguez - dribeas启发了我。:)
这是一个错误。Clang 3.2 主干和 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 限定的)非联合类类型,则该对象是零初始化的 [...]
这反过来意味着成员应该被清零。