Страницы

Поиск по вопросам

понедельник, 8 октября 2018 г.

Ошибка при инициализации структуры через фигурные скобки

При попытке инициализации структуры через фигурные скобки вылезает ошибка:
error C2440: инициализация: невозможно преобразовать "initializer list" в "FunctionRelease"
struct FunctionRelease { std::string firstOperand; std::string secondOperand; Operation operation; bool isTwoIdentifier = false; };
...
int main() { struct FunctionRelease functionRelease = { "v0", "v1", Operation::DIV, true }; }
В чём может быть причина?


Ответ

Инициализация экземпляра класса путём последовательного перечисления в фигурных скобках через запятую значений для полей этого класса, называется агрегатной инициализацией. Легко догадаться, что для возможности агрегатной инициализации требуется чтобы сам класс удовлетворял требованиям агрегата.
Эти требования в последних стандартах звучат по-разному (выделение текста моё):
C++11
An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equalinitializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3) С++14
An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).
Т.о. в более свежем стандарте ослабили требования к агрегатному типу, убрав необходимость отсутствия инициализации непосредственно в классе.
Т.к. проблема проявила себя, значит был использован вариант c++11. И для решения достаточно убрать инициализацию члена isTwoIdentifier в классе. Но если есть возможность скомпилировать код в режиме c++14, то никакие изменения вовсе не потребуются.

Комментариев нет:

Отправить комментарий