У меня есть простая оболочка RAII для управления определенным ресурсом. Вот интерфейс:Как удалить оператор присваивания перемещения и сохранить совместимость с контейнерами std?
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
? Интересно, удалит ли он одну ссылку слишком много и повлечет за собой создание ненужного временного объекта.
Вы предотвращаете перемещение, но способствуете копированию? звучит странно. что это за ресурс? –
@DavidHaim: да, точно. Неважно, какой ресурс он есть, я просто хочу уйти с минимальным количеством кода. Я не могу отказаться от копирования, но я могу переехать. –
Путь к переезду - это не определять его, то, что вы сделали, это не «переместить», это «яд», поэтому копирование rvalues невозможно ». Это не то же самое. –