web-dev-qa-db-ja.com

C ++ 11:std :: arrayの初期化を修正しますか?

次のように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の単なるバグですか、それとも意図的に行われたものですか?もしそうなら、なぜですか?

58
Byzantian

これは、std::arrayのベアインプリメンテーションです。

template<typename T, std::size_t N>
struct array {
    T __array_impl[N];
};

これは、内部{}を使用して内部配列を初期化するデータメンバのみが従来の配列である集約構造体です。

ブレースの省略は、集約の初期化を伴う特定の場合に許可されますが(通常は推奨されません)、この場合、使用できるブレースは1つだけです。こちらをご覧ください: C++配列のベクトル

44
Pubby

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"} };
30
Draco Ater

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 =

std :: array reference

4
Amit G.