5
struct A
{
private:
    int a, b, c;
};

int main()
{
    A a1{};
    A a2 = {};

    return 0;
}

コードはVC++2012(最新のアップデート「2012年11月CTP」)によってコンパイルされました。

a1とa2はゼロで初期化されると思いますが、そうではありません。a1とa2は初期化されていません。

なんで?

4

2 に答える 2

7

Microsoft の Community Tech Preview コンパイラは、ベータ版と呼ぶほど自信がありませんが、バグが含まれているということですか? ;)

これはバグです。期待どおりに動作するはずです。として報告してください。

于 2012-11-16T19:28:52.490 に答える
6

この回答には、最終結果を以前とは逆に変更するわずかな書き直しがあったことに注意してください。@ DavidRodríguezに感謝します-私を啓発してくれたdribeas。:)

これはバグです。Clang3.2トランクとGCC4.7+も一致し、メンバーをゼロ初期化します。

いくつかの標準的な時間。T x{};(または)は、リスト初期化または集約初期= {}化のいずれかとして解釈できることに注意してください。これはプライベートメンバーを持っているため集約ではなく、プライベートメンバーによって初期化することはできません。A

§8.5.1 [dcl.init.aggr] p1

アグリゲートは、[...]プライベートまたは保護された非静的データメンバーを持たない配列またはクラス(第9節)です[...]

a1これはlist-initializationのみを残し、との両方をvalue-initializeしa2ます。

§8.5.1 [dcl.init.list] p3

リスト-オブジェクトまたはタイプの参照の初期化は、T次のように定義されます。

  • 初期化子リストに要素がなくT、デフォルトのコンストラクターを持つクラス型である場合、オブジェクトは値で初期化されます。

値の初期化は、特定のケースでは次のように指定されます。

§8.5 [dcl.init] p7

T(おそらくcv修飾された)非ユニオンクラスタイプであり、ユーザー提供のコンストラクターがない場合、オブジェクトはゼロで初期化されます[...]

そしてこれは、メンバーをゼロにする必要があることを意味します。

于 2012-11-16T19:38:28.723 に答える