Как удалить оператор присваивания перемещения и сохранить совместимость с контейнерами 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
? Интересно, удалит ли это одну ссылку слишком много и приведет к созданию ненужного временного объекта.
1 ответ
И, очевидно, мне нужно либо удалить, либо правильно реализовать его, так как я только что научился трудному пути.
Нет, ты не
В вашем классе есть пользовательский конструктор копирования, оператор назначения копирования и деструктор, поэтому компилятор не определит для вас оператор назначения перемещения.
Так что просто прекратите пытаться удалить его, и класс будет скопирован, а не перемещен.
При удаленных операциях перемещения вы не можете копировать значения типа, т. Е. Это становится чрезвычайно трудно использовать в качестве типа значения (в том числе в контейнерах). Без операций перемещения он просто сделает глубокое копирование значений r, что безопасно и, вероятно, то, что вы хотите.
Удаление операций перемещения имеет смысл, только если вы хотите, чтобы класс был полностью неподвижным и не копируемым, например, что-то вроде типа мьютекса, где идентичность объекта является критической, а не его значение. Никогда не имеет смысла иметь копируемый тип с удаленными ходами.