Инициализация члена внутри класса с помощью списка инициализаторов с использованием унифицированного синтаксиса инициализации?[дубликат]

StackOverflow https://stackoverflow.com//questions/24035388

Вопрос

Я пытаюсь скомпилировать следующее с помощью MSVC2013:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
}

Компилятор выдает мне следующую ошибку: SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.

Если я изменю код на этот:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{{false, false, false}};
}

программа компилируется и запускается нормально.Это проблема с компилятором, или я не понимаю синтаксис?Из того, что я читал, первая версия должна скомпилироваться.

Это было полезно?

Решение

Вот ответственная грамматика из N3797:

// after a member declaration:
braced-or-equal-initializer-list:
  = initializer-clause
  braced-init-list

braced-init-list:
  { initializer-list ,OPT }
  { }

initializer-list:
  initializer-clause
  initializer-list, initializer-clause

initializer-clause:
  assignment-expression
  braced-init-list

Итак, я бы сказал, что первое утверждение верно, и оно действительно принято недавним gcc и clang.

Другие советы

Если расставить точки с запятой так, как требуется

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
};

тогда кажется, что это ошибка компилятора MS VC++ 2013.По крайней мере, код успешно скомпилирован по адресу www.ideone.com.

Structire SomeStruct является агрегатом и должен быть инициализирован с помощью списка инициализаторов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top