1. ホーム
  2. c++11

[解決済み] std::array のデフォルトの初期化?

2022-08-11 17:45:54

質問

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

EDIT : もしそうでなければ、すべての要素をデフォルト値に初期化するために、すべての配列(ゼロサイズ配列を含む)で動作する構文があるのでしょうか?

EDIT について 参照 と書くと、デフォルトのコンストラクタの説明文に

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

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

どのように解決するのですか?

定義によると、デフォルトの初期化とは、他の初期化が指定されていないときに行われる初期化のことで、C++言語が保証しているのは、以下の通りです。 任意の オブジェクトがデフォルトで初期化されることが保証されています(C++11 §8.5/11)。これには、以下の型のオブジェクトが含まれます。 std::array<T, N>T[N] .

デフォルトの初期化が効果を持たず、オブジェクトの値が不確定になる型があることに注意してください:非クラス、非配列型(§8.5/6)です。その結果、そのような型を持つオブジェクトのデフォルト初期化された配列は、例えば、不定な値を持つことになります。

int plain_int;
int c_style_array[13];
std::array<int, 13> cxx_style_array;

c スタイルの配列と std::array が不定値の整数で埋め尽くされているのと同じように plain_int が不定値であるのと同様です。

すべての要素をデフォルト値に初期化するために、すべての配列(ゼロサイズ配列を含む)上で動作する構文はありますか?

あなたが "to their default value" と言ったとき、あなたは本当に "to initialize all elements to; を意味するのでしょうか。 T{} という意味なのでしょう。それは デフォルト初期化 であり、それは 値初期化 (8.5/7). C++11では、各宣言に空のイニシャライザーを与えることで、非常に簡単に値の初期化を要求することができます。

int plain_int{};
int c_style_array[13]{};
std::array<int, 13> cxx_style_array{};

これにより、配列のすべての要素が順番に値初期化され、結果として plain_int となり、両方の配列のすべてのメンバがゼロに初期化されます。