これは機能します:
int arr[10] = {};
のすべての要素はarr
、値がゼロに初期化されます。
これが機能しない理由:
std::array<int, 10> arr({});
g++ (バージョン 4.8.2) から次の警告が表示されます。
警告: メンバ 'std::array<int, 10ul>::_M_elems' の初期化子がありません</p>
これは機能します:
int arr[10] = {};
のすべての要素はarr
、値がゼロに初期化されます。
これが機能しない理由:
std::array<int, 10> arr({});
g++ (バージョン 4.8.2) から次の警告が表示されます。
警告: メンバ 'std::array<int, 10ul>::_M_elems' の初期化子がありません</p>
まず、オブジェクトで初期化子を使用できますが、意味的には、一時的な値で初期化されたオブジェクトからのコピーコンストラクターを使用した直接初期化を表します。つまり、次と同等です({})
std::array
std::array
std::array<int, 10> arr(std::array<int, 10>{});
そして、実際にコンパイルすることになっています。
({})
第二に、ただできるときは、本当に道を行く必要はありません
std::array<int, 10> arr = {};
また
std::array<int, 10> arr{};
2 つのうちの最初のものは、あなたの に構文的に最も似ていますint arr[10] = {};
。構文のバージョンを作成したときに、({})
代わりに使用することにしたのはなぜですか?= {}
std::array
= {}
十分な数の人々が、これをコンパイルするときにこれを「問題」として指摘してい-Werror
ます。
std::array<int, 10> arr{{}};
gcc 4.9.2 では警告が表示されません。
なぜこれが解決するのかについて少し追加します。私の理解では、 std::array は実際には C 配列を唯一のメンバーとして持つクラスです。したがって、中かっこを 2 倍にするのは理にかなっています。外側の中かっこはクラスを初期化していることを示し、次に内側の中かっこはデフォルトでクラスの唯一のメンバーを初期化します。
クラスに変数が 1 つしかない場合はあいまいさがないため、{} のペアを 1 つだけ使用することは合理的ですが、gcc はここで過度に衒学的であり、警告します。