2016-12-05 8 views
0

Я прочитал здесь: What are move semantics? под вторичным названием: Специальных функций-членов, причины, почему мы должны унифицировать и копирующий оператор присваивания оператора присваивания & перемещения в оператор присваивания \ копия один хода,Разделительных копировать/перемещать оператор присваивания

но что, если мы хотим запретить копирование или перемещение? должен ли в этом случае указать «удалить» на запрещенном конструкторе и реализовать другое? (т. е. разделение между ними).

Если да, то какой способ это сделать?

+0

Просто отделите их, как и первые два блока кода в этом разделе – Danh

+0

, вы имеете в виду идиому 'copy-and-swap' для операторов присваивания? – vu1p3n0x

+0

vu1p3nox, Да, я. – Etay

ответ

2

Если вы хотите создать класс, который можно перемещать, но не копировать, вы должны реализовать конструктор перемещения и пометить конструктор копирования как удаленный.

Образец копирования и замены по-прежнему работает (скорее, смены и замены). Поскольку параметр может быть создан только для перемещения, доступно только перемещение.

class MyClass 
{ 
    MyClass(MyClass&& other) { 
     // Do your move here 
    } 
    MyClass(const MyClass& other) = delete; 

    MyClass& operator=(MyClass other) { 
     // You can still use copy-and-swap (move-and-swap, really) 
     // Since MyClass is non-copyable, only move assignment will be available 
    } 
}; 

Или вы можете просто создать оператор присваивания шаг (MyClass& operator=(MyClass&& other)) вместо. Оператор присваивания по умолчанию будет неявно удален, если вы объявите конструктор перемещения.

+0

Спасибо большое! – Etay