124

C++11では、構文が配列のすべての要素をデフォルトで初期化するstd::arrayという保証がありますか?std::array<T, N> x;

編集:そうでない場合、すべての要素をデフォルト値に初期化するために、すべての配列(サイズがゼロの配列を含む)で機能する構文はありますか?

EDIT : cppreferenceでは、デフォルトのコンストラクターの説明は次のように述べています。

(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array 

したがって、答えはイエスかもしれません。しかし、標準または将来の標準に従って、それを確認したいと思います。

4

5 に答える 5

30

Default-initializationは、潜在的に初期化をまったく意味しない標準の用語であるため、おそらくzero-initializationを意味します。

cppreference.com の説明は、実際には少し誤解を招くものです。std::arrayは集約クラスであり、要素の型がプリミティブの場合、それは POD (「単純な古いデータ」) であり、セマンティクスは C 言語と密接に一致します。の暗黙的に定義されたコンストラクターstd::array< int, N >は、まったく何もしない単純なものです。

std::array< int, 3 >()またはゼロ化された値を提供する構文はstd::array< int, 3 > x{}、コンストラクターを呼び出すことによってそうしません。ゼロを取得することは、C++11 §8.5/8 で指定されているvalue-initializationの一部です。

タイプ T のオブジェクトを値で初期化するとは、次のことを意味します。

— T が (おそらく cv 修飾された) クラス型であり、ユーザー提供または削除された既定のコンストラクターがない場合、オブジェクトはゼロで初期化されます...そして、T に重要な既定のコンストラクターがある場合、オブジェクトは既定で初期化されます。

std::arrayユーザー提供のデフォルト コンストラクタがないため、ゼロで初期化されます。暗黙的に定義されたデフォルトのコンストラクターがありますが、それは自明なので、デフォルトで初期化されることはありません。(ただし、定義による簡単な初期化は実行時に影響しないため、これは違いはありません。)

そうでない場合、すべての要素をデフォルト値に初期化するためにすべての配列(サイズがゼロの配列を含む)で機能する構文はありますか?

C スタイルの配列 とstd::arrayは両方とも集合体であり、集合体を完全にゼロ初期化する方法は、構文を使用すること= {}です。これは C++98 以降で機能します。C スタイルの配列は範囲を 0 にすることはできず、ゼロではないことに注意してくださいsizeof (std::array< X, 0 >)

于 2013-08-19T00:18:54.717 に答える
0

まず第一に、T x[N] はデフォルトで要素を初期化しますが、スカラー型 T のデフォルトの初期化は実際には何もしません。上記は std::array x にも当てはまります。必要なのはリストの初期化だと思います。

于 2014-06-26T09:35:08.983 に答える