27
struct MyClass
{
  std::array<int, 10> stdArr;

  MyClass() : stdArr()
  {}
};

MyClass c;

質問:

  1. c.stdArrゼロ初期化されていますか?
  2. はいの場合 - なぜですか?

私自身の矛盾した答え:

  1. ゼロで初期化されています: std::arrayC 配列のように動作したいです。上記の例stdArrが c-array の場合stdArr()、初期化リストでゼロ初期化されます。member()初期化リスト内に書き込むと、オブジェクトが初期化されると思います。

  2. ゼロで初期化されていません:

    • std::array通常、私の場合は単一のメンバーがいますint[10] _Elems;
    • 通常、基本型および基本型の配列は、int[N]デフォルトで初期化されません。
    • std::arrayデフォルトで構築されていることを意味する集約型です。
    • を初期化するカスタムコンストラクターがないため_Elems、ゼロ初期化されていないと思います。

std::arrayC++11 標準に従った正しい動作は何ですか?

4

2 に答える 2

21

c.stdArrゼロ初期化されていますか?

はい

はいの場合 - なぜですか?

これにより、次の値の初期化が実行されstdArrます。

MyClass() : stdArr() {}

このコンテキストでは、値の初期化の効果は、オブジェクトのゼロ初期化です。

編集: What are Aggregates and PODs...?には関連情報がたくさんあります。

于 2013-06-25T12:52:42.470 に答える
0

「std::array は c-array のように動作したい」は、標準が動作を説明する方法ではありません。これはユーザー定義型であり、ユーザー定義型のメンバーは、コンストラクターを呼び出すことによって初期化されます。つまり、array<int,10>::array()

于 2013-06-25T12:44:11.700 に答える