Почему нельзя просто инициализировать (с фигурными скобками) 2D std::array?
Возможный дубликат:
C++, почему поведение 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}}
}};
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