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

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

    return 0;
}

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

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

为什么?

4

2 回答 2

7

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

这是一个错误;它应该按照您的预期运行。请这样报告。

于 2012-11-16T19:28:52.490 回答
6

请注意,此答案略有改写,最终结果与以前相反。感谢@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 限定的)非联合类类型,则该对象是零初始化的 [...]

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

于 2012-11-16T19:38:28.723 回答