Как удалить оператор присваивания перемещения и сохранить совместимость с контейнерами std?

У меня есть простая оболочка RAII для управления определенным ресурсом. Вот интерфейс:

struct ResourceWrapper
{
explicit ResourceWrapper(RESOURCE resource);
ResourceWrapper(const ResourceWrapper& other);
ResourceWrapper& operator=(const ResourceWrapper& other);
~ResourceWrapper();

ResourceWrapper(ResourceWrapper&& other) = delete;
ResourceWrapper& operator=(ResourceWrapper&& other) = delete;
};

Проблема в том, что я больше не могу использовать этот класс с std контейнеры и алгоритмы, как только я явно удаляю оператор присваивания перемещения. И, очевидно, мне нужно либо удалить, либо должным образом реализовать его, так как я только что выучил трудный путь.

Другой альтернативой может быть реализация перемещения с помощью обычного оператора присваивания, но я не уверен, как это сделать правильно. Я полагаю, мне нужно что-то вроде std::remove_reference? Интересно, удалит ли это одну ссылку слишком много и приведет к созданию ненужного временного объекта.

3

Решение

И, очевидно, мне нужно либо удалить, либо должным образом реализовать его, так как я только что выучил трудный путь.

Нет, ты не

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

Так что просто прекратите пытаться удалить его, и класс будет скопирован, а не перемещен.

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

Удаление операций перемещения имеет смысл, только если вы хотите, чтобы класс был полностью неподвижным и не копируемым, например что-то вроде типа мьютекса, где критически важна идентичность объекта, а не его значение. Никогда не имеет смысла иметь копируемый тип с удаленными ходами.

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]