VC ++的一个大错误? 为什么初始化器
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
; 铿锵-3.0绝对疯狂并输出垃圾(例如574874232
)。