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