Удаление конструкторов копирования и операторов присваивания копии. Какие из них необходимы?

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

        MyClass             (       MyClass &)  = delete;
MyClass             (const  MyClass &)  = delete;
MyClass             (       MyClass &&) = delete;
MyClass             (const  MyClass &&) = delete;
MyClass    operator=(       MyClass &)  = delete;
MyClass    operator=(const  MyClass &)  = delete;
const   MyClass    operator=(       MyClass &)  = delete;
const   MyClass    operator=(const  MyClass &)  = delete;
MyClass &  operator=(       MyClass &)  = delete;
MyClass &  operator=(const  MyClass &)  = delete;
const   MyClass &  operator=(       MyClass &)  = delete;
const   MyClass &  operator=(const  MyClass &)  = delete;
MyClass && operator=(       MyClass &)  = delete;
MyClass && operator=(const  MyClass &)  = delete;
const   MyClass && operator=(       MyClass &)  = delete;
const   MyClass && operator=(const  MyClass &)  = delete;
MyClass    operator=(       MyClass &&) = delete;
MyClass    operator=(const  MyClass &&) = delete;
const   MyClass    operator=(       MyClass &&) = delete;
const   MyClass    operator=(const  MyClass &&) = delete;
MyClass &  operator=(       MyClass &&) = delete;
MyClass &  operator=(const  MyClass &&) = delete;
const   MyClass &  operator=(       MyClass &&) = delete;
const   MyClass &  operator=(const  MyClass &&) = delete;
MyClass && operator=(       MyClass &&) = delete;
MyClass && operator=(const  MyClass &&) = delete;
const   MyClass && operator=(       MyClass &&) = delete;
const   MyClass && operator=(const  MyClass &&) = delete;

13

Решение

Вам нужно только пометить один конструктор копирования и оператор присваивания копии как delete, Присутствие версий копии предотвратит неявное объявление конструктора перемещения и оператора присваивания перемещения, а объявление одной формы специальной функции-члена копирования подавляет неявное объявление других форм.

MyClass (const MyClass&) = delete;
MyClass& operator= (const MyClass&) = delete;

Обратите внимание, что после C ++ 11 неявное определение оператора присваивания как значения по умолчанию устарело, и вместо этого оно должно быть определено как удаленное.

21

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

конструктор копирования

MyClass             (const  MyClass &)  = delete;

оператор присваивания

MyClass &  operator=(const  MyClass &)  = delete;

Это единственные конструкторы копирования и операторы копирования, неявно определенные.

5

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