У меня есть вариант использования, что мой объект не должен быть скопирован каким-либо образом. Ниже я написал преувеличенный полный список удаления конструктора копирования и оператора присваивания. Их так много, что я не могу понять, какие из них использовать, и иногда это делает меня параноиком. Мне не нужно писать их все в моем коде, не так ли? Итак, чтобы предотвратить копирование объектов любого вида, какой из них я должен использовать?
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;
Вам нужно только пометить один конструктор копирования и оператор присваивания копии как delete
, Присутствие версий копии предотвратит неявное объявление конструктора перемещения и оператора присваивания перемещения, а объявление одной формы специальной функции-члена копирования подавляет неявное объявление других форм.
MyClass (const MyClass&) = delete;
MyClass& operator= (const MyClass&) = delete;
Обратите внимание, что после C ++ 11 неявное определение оператора присваивания как значения по умолчанию устарело, и вместо этого оно должно быть определено как удаленное.
MyClass (const MyClass &) = delete;
MyClass & operator=(const MyClass &) = delete;
Это единственные конструкторы копирования и операторы копирования, неявно определенные.