C++ Структура. use of deleted function operator=

574
04 января 2017, 02:57
// menu.h
struct MenuParameter {
   String textBefore;
   unsigned int &value;
   String (&valueFormatter)(unsigned int value);
   String textAfter;
};

// menu.cpp

void MenuParameterController::add(
   String textBefore,
   unsigned int &value,
   String (&valueFormatter)(unsigned int value),
   String textAfter
) {
  items[itemsCount] = {textBefore, value, valueFormatter, textAfter};
}

Лог компилятора

use of deleted function 'MenuParameter& MenuParameter::operator=(MenuParameter&&)'

'MenuParameter& MenuParameter::operator=(MenuParameter&&)' is implicitly deleted because the default definition would be ill-formed: struct MenuParameter {

Почему это возникает и как избежать?

Answer 1

Причина состоит в том, что структура имеет в качестве члена данных объект ссылочного типа

unsigned int &value;

Объекты ссылочного типа должны инициализироваться при создании объекта класса или структуры. Вы не можете переназначить ссылку. Поэтому неявный копирующий оператор присваивания объявляется компилятором как удаленный.

Из стандарта C++ (12.8 Copying and moving class object)

23 A defaulted copy/move assignment operator for class X is defined as deleted if X has:

...

  • a non-static data member of reference type, or

Вам следует в явном виде определить копирующий оператор присваивания, если это возможно.

В вашем случае вы могли бы вместо ссылки объявить указатель. Например,

struct MenuParameter {
   String textBefore;
   unsigned int *value;
                ^^^^^^ 
   String (&valueFormatter)(unsigned int value);
   String textAfter;
};

и соответствующим образом определить копирующий оператор присваивания.

READ ALSO
Виртуальный массив

Виртуальный массив

Допустим есть два обычных одномерных массива и есть функция принимающая один массивНеобходимо объединить эти два массива в один и передать...

464
Ассемблерная команда LEA

Ассемблерная команда LEA

Не знаю почему, но эта ассемблерная команда не дает мне покоя LEA

463
подсчет количества

подсчет количества

link: default null, но значение notNULLСтруктура таблиц, значение по умолчанию

601