Инициализация члена внутри класса с помощью списка инициализаторов с использованием унифицированного синтаксиса инициализации?[дубликат]
Вопрос
Я пытаюсь скомпилировать следующее с помощью 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 является агрегатом и должен быть инициализирован с помощью списка инициализаторов.