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

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

        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;

2 ответа

Решение

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

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

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

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

MyClass             (const  MyClass &)  = delete;

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

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

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

Другие вопросы по тегам