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)があります。これは削除されず、簡単です(ibid)。したがって、8.5p8の2番目の箇条書きが適用されます。

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 に答える