Могу ли я написать операторы копирования и перемещения для класса?

Это мои прототипы,

MyClass& operator=(MyClass rhs);   // copy assignment
MyClass& operator=(MyClass &&rhs); // move assignment

Но когда я звоню

MyClass a, b;
a = std::move(b);

, есть ошибка.

556 IntelliSense: more than one operator "=" matches these operands:
function "MyClass::operator=(MyClass rhs)"function "MyClass::operator=(MyClass &&rhs)"operand types are: MyClass = MyClass

И компилятор возвращает:

Error   56  error C2593: 'operator =' is ambiguous

1

Решение

Разрешение перегрузки неоднозначно, потому что когда вы передаете rvalue, оба MyClass а также MyClass && может быть непосредственно инициализирован им.

Если вы хотите предоставить другую реализацию назначения копирования и перемещения, обычным способом является получение параметра оператора назначения копирования по ссылке const:

MyClass& operator=(const MyClass &rhs);   // copy assignment
MyClass& operator=(MyClass &&rhs); // move assignment

Сделанный следующим образом, оператор присваивания перемещения является строго лучшим соответствием (неконстантному) аргументу rvalue, поэтому он выбирается с помощью разрешения перегрузки.

Альтернативный подход, называемый copy-and-swap, состоит в том, чтобы предоставить только оператор присваивания, взять параметр по значению и использовать swap реализовать это:

MyClass& operator=(MyClass rhs)
{
swap(*this, rhs);
return *this;
};

Это повторно использует конструктор копирования / перемещения для назначения. Это требует, чтобы вы реализовали swap функция, которая должна быть не метательной.

Недостатком этого подхода является то, что иногда ручное выполнение копирования может быть дешевле, чем выполнение создания копии с последующим перемещением.

6

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