Страницы

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

четверг, 5 декабря 2019 г.

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

#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, то никакие изменения вовсе не потребуются.

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

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