次のようにstd :: arrayを初期化すると、コンパイラーは中括弧の欠落に関する警告を表示します
std::array<int, 4> a = {1, 2, 3, 4};
これにより問題が修正されます。
std::array<int, 4> a = {{1, 2, 3, 4}};
これは警告メッセージです:
missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces]
これは私のバージョンのgccの単なるバグですか、それとも意図的に行われたものですか?もしそうなら、なぜですか?
これは、std::array
のベアインプリメンテーションです。
template<typename T, std::size_t N>
struct array {
T __array_impl[N];
};
これは、内部{}
を使用して内部配列を初期化するデータメンバのみが従来の配列である集約構造体です。
ブレースの省略は、集約の初期化を伴う特定の場合に許可されますが(通常は推奨されません)、この場合、使用できるブレースは1つだけです。こちらをご覧ください: C++配列のベクトル
cppreference に従います。二重中括弧は、=
は省略されます。
// construction uses aggregate initialization
std::array<int, 3> a1{ {1,2,3} }; // double-braces required
std::array<int, 3> a2 = {1, 2, 3}; // except after =
std::array<std::string, 2> a3 = { {std::string("a"), "b"} };
CWG 1270より前のC++ 11では二重括弧が必要でした(改訂後のC++ 11およびC++ 14以降では必要ありません):
// construction uses aggregate initialization
std::array<int, 3> a1{ {1, 2, 3} }; // double-braces required in C++11 prior to the CWG 1270 revision
// (not needed in C++11 after the revision and in C++14 and beyond)
std::array<int, 3> a2 = {1, 2, 3}; // never required after =