52

重複の可能性:
c ++ std::vectorとstd::arrayのinitializer_listの動作が異なる理由

単純な2D配列(3X2)を定義しました:

  std::array<std::array<int,3>,2> a {
    {1,2,3},
    {4,5,6}
  };

この初期化が機能せず、gcc4.5エラーが発生することに驚きました。too many initializers for 'std::array<std::array<int, 3u>, 2u>'

この構文を使用できないのはなぜですか?

回避策を見つけました。1つは中かっこを追加して非常に面白いものですが、最初の最も簡単なアプローチが有効でないのはなぜでしょうか。

回避策:

  // EXTRA BRACES
  std::array<std::array<int,3>,2> a {{
    {1,2,3},
    {4,5,6}
  }};

  // EXPLICIT CASTING
  std::array<std::array<int,3>,2> a {
    std::array<int,3>{1,2,3},
    std::array<int,3>{4,5,6}
  };

[アップデート]

OK、KerrekSBとコメントのおかげで違いがわかります。したがって、このCの例のように、私の例では中括弧が少なすぎるようです。

struct B {
  int array[3];
};
struct A {
  B array[2];
};

B b = {{1,2,3}};
A a = {{
     {{1,2,3}},
     {{4,5,6}}
}};
4

1 に答える 1

71

std::array<T, N>C 配列を含む集約です。それを初期化するには、クラス自体の外側のブレースと C 配列の内側のブレースが必要です。

std::array<int, 3> a1 = { { 1, 2, 3 } };

このロジックを 2D 配列に適用すると、次のようになります。

std::array<std::array<int, 3>, 2> a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } };
//                                   ^ ^ ^ ^            ^ ^
//                                   | | | |            | |
//                                   | +-|-+------------|-+
//                                   +-|-+-|------------+---- C++ class braces
//                                     |   |
//                                     +---+--- member C array braces
于 2012-10-11T16:50:25.777 に答える