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++的bug吗?我的VC++是最新的2012年11月CTP。
发布于 2012-12-17 19:45:06
值-非聚合类类型的初始化包含在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)。
https://stackoverflow.com/questions/13904020
复制相似问题