C++11标准8.5.4.3 说:
"如果初始值设定项列表没有元素,并且 T 是具有默认构造函数的类类型,则对象是值初始化的。"
struct A
{
int get() { return i; }
private:
int i;
};
int main()
{
A a = {};
int n = a.get();
cout << n << endl;
// n is a random number rather than 0
return 0;
}
这是VC++的错误吗?我的VC++是最新的2012年11月CTP。
8.5p8 涵盖了非聚合类类型的值初始化。 在您的情况下,(非联合)类有一个隐式声明的默认默认无参数构造函数 (12.1p5),该构造函数不会被删除并且是微不足道的(同上)。 因此,8.5p8 的第二个项目符号适用:
— 如果
T
是一个(可能符合 CV 条件的)非联合类类型,没有用户提供或删除的默认构造函数,则该对象为零初始化,如果T
具有非平凡的默认构造函数,则默认初始化;
所以A
应该初始化为零,程序应该打印0
。
在以下程序上:
struct A { int get() { return i; } private: int i; };
#include <iostream>
int main() {
char c[sizeof(A)];
new (c) int{42};
std::cout << (new (c) A{})->get() << 'n';
}
GCC-4.7.2 正确输出 0
;GCC-4.6.3 错误地输出42
;clang-3.0 绝对疯狂并输出垃圾(例如 574874232
)。