76

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

4

4 に答える 4

52

これはの裸の実装ですstd::array:

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

{}これは、内部配列を初期化するために内部が使用されるように、唯一のデータ メンバーが従来の配列である集約構造体です。

集合体の初期化を伴う特定のケースではブレースの省略が許可されるため (ただし、通常は推奨されません)、この場合は 1 つのブレースのみを使用できます。ここを参照してください:配列の C++ ベクトル

于 2013-01-06T01:13:34.603 に答える
39

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"} };
于 2013-01-06T01:17:20.883 に答える