VC++的一个大错误?为什么initializer-list没有对结构进行值初始化?

xml*_*lmx 7 c++ aggregate initialization initializer-list c++11

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;
}
Run Code Online (Sandbox Code Playgroud)

这是VC++的错误吗?我的VC++是最新的2012年11月CTP.

eca*_*mur 3

8.5p8 涵盖了非聚合类类型的值初始化。在您的情况下,(非联合)类有一个隐式声明的默认默认无参数构造函数(12.1p5),它不会被删除并且很简单(同上)。因此 8.5p8 的第二个项目符号适用:

\n\n
\n

\xe2\x80\x94 如果T是一个(可能是 cv 限定的)非联合类类型,没有用户提供或删除的默认构造函数,则该对象为零初始化,并且,如果T有一个重要的默认构造函数,则默认 -已初始化;

\n
\n\n

所以A应该是零初始化,并且程序应该打印0

\n\n

关于以下程序:

\n\n
struct A { int get() { return i; } private: int i; };\n#include <iostream>\nint main() {\n    char c[sizeof(A)];\n    new (c) int{42};\n    std::cout << (new (c) A{})->get() << '\\n';\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

gcc-4.7.2 正确输出0;gcc-4.6.3 错误输出42;clang-3.0 绝对疯狂并输出垃圾(例如574874232)。

\n