Подтвердить что ты не робот

Почему нет простой инициализации (с фигурными скобками) 2D std:: array?

Возможный дубликат:
С++, почему поведение initializer_list для std::vector и std:: array различается

Я определил простой 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>'

Почему я не могу использовать этот синтаксис?

Я нашел обходные пути, один очень забавный с дополнительными фигурными скобками, но просто удивляюсь, почему первый, самый простой подход недействителен?

Обходные:

  // 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}
  };

[ОБНОВЛЕНИЕ]

Хорошо, благодаря 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}}
}};
4b9b3361

Ответ 1

std::array<T, N> - это совокупность, содержащая массив C. Чтобы инициализировать его, вам нужны внешние фигурные скобки для самого класса и внутренних скобок для массива C:

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

Применение этой логики к двумерному массиву дает следующее:

std::array<std::array<int, 3>, 2> a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } };
//                                   ^ ^ ^ ^            ^ ^
//                                   | | | |            | |
//                                   | +-|-+------------|-+
//                                   +-|-+-|------------+---- C++ class braces
//                                     |   |
//                                     +---+--- member C array braces