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 )。

链接地址: http://www.djcxy.com/p/11611.html

上一篇: A BIG bug of VC++? Why does initializer

下一篇: ZF2 module loading performance