При попытке инициализации структуры через фигурные скобки вылезает ошибка:
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, то никакие изменения вовсе не потребуются.
Комментариев нет:
Отправить комментарий