Когда в списке инициализаторов можно опускать внешние фигурные скобки?

У меня возникла ошибка C2078 в VC2010 при компиляции приведенного ниже кода.

struct A
  {
  int foo;
  double bar;
  };

std::array<A, 2> a1 = 
  // error C2078: too many initializers
  {
    {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 ::. Некоторые примеры:

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}};  // error C2078: too many initializers
D bark3 = {{{1,2},{3,4}}};

Я до сих пор не понимаю, почему struct Dвыдает ошибку, а B и C — нет.

47
задан Manjabes 31 July 2012 в 08:31
поделиться