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 ;clang-3.0 绝对疯狂并输出垃圾(例如 574874232 )。

最新更新