7

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。

4

1 回答 1

3

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

于 2012-12-17T11:45:05.687 回答