Когда можно опустить внешние фигурные скобки в списке инициализации?
Я получаю ошибку C2078 в VC2010 при компиляции следующего кода:
struct A
{
int foo;
double bar;
};
std::array<A, 2> a1 =
// ошибка C2078: слишком много инициализаторов
{
{0, 0.1},
{2, 3.4}
};
// OK
std::array<double, 2> a2 = {0.1, 2.3};
Я обнаружил, что корректный синтаксис для a1
выглядит так:
std::array<A, 2> a1 =
{{
{0, 0.1},
{2, 3.4}
}};
Вопрос в том, почему дополнительные фигурные скобки требуются для a1
, но не нужны для a2
?
Обновление
Проблема, похоже, не специфична для std::array. Вот несколько примеров:
struct B
{
int foo[2];
};
// OK
B meow1 = {1,2};
B bark1 = {{1,2}};
struct C
{
struct
{
int a, b;
} foo;
};
// OK
C meow2 = {1,2};
C bark2 = {{1,2}};
struct D
{
struct
{
int a, b;
} foo[2];
};
D meow3 = {{1,2},{3,4}}; // ошибка C2078: слишком много инициализаторов
D bark3 = {{{1,2},{3,4}}};
Я все еще не понимаю, почему struct D
вызывает ошибку, а B и C — нет.
Когда действительно стоит использовать noexcept?
Возможно ли вывести тип переменной в стандартном C++?
Почему `std::initializer_list` не поддерживает оператор подиндексации?
Можно ли вручную определить преобразование для класса enum?
Стоит ли игнорировать предупреждение "-Wmissing-braces" от gcc/clang?