#cpp #cpp11
При попытке инициализации структуры через фигурные скобки вылезает ошибка: 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 }; } В чём может быть причина?
Ответы
Ответ 1
Инициализация экземпляра класса путём последовательного перечисления в фигурных скобках через запятую значений для полей этого класса, называется агрегатной инициализацией. Легко догадаться, что для возможности агрегатной инициализации требуется чтобы сам класс удовлетворял требованиям агрегата. Эти требования в последних стандартах звучат по-разному (выделение текста моё): 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, то никакие изменения вовсе не потребуются.
Комментариев нет:
Отправить комментарий