Кое-что пришло мне в голову, что я считаю вполне разумным, но я хотел бы узнать мнение людей об этом на случай, если я просто что-то упустил. Итак, во-первых, мое понимание T& operator=(T&& rhs)
заключается в том, что нам не важно, что будет с содержимым rhs
, когда мы закончим, просто содержимое будет перемещено в this
, а rhs
можно безопасно уничтожить.
При этом обычная реализация оператора копирования-присваивания, безопасная для исключений, при условии, что свопы дешевы, выглядит следующим образом:
T& operator=(const T& rhs) {
if(this != &rhs) {
T(rhs).swap(*this);
}
return *this;
}
Таким образом, один из естественных способов реализации оператора перемещения-присваивания будет выглядеть следующим образом:
T& operator=(T&& rhs) {
if(this != &rhs) {
T(std::move(rhs)).swap(*this);
}
return *this;
}
Но потом мне пришло в голову, что rhs
не обязательно должно быть пустым! Итак, почему бы просто не сделать простой swap
?
T& operator=(T&& rhs) {
rhs.swap(*this); // is this good enough?
return *this;
}
Я думаю, что это удовлетворяет тому, что должен делать оператор присваивания перемещения... но, как я уже сказал, это только что пришло мне в голову, поэтому я предполагаю, что, возможно, я что-то упускаю.
Единственный «недостаток», о котором я могу думать, заключается в том, что вещи, принадлежащие this
, потенциально будут жить дольше, используя простой обмен, по сравнению с версией, которая выполняет перемещение-конструкцию/своп.
Мысли?
T& operator=(T rhs) { rhs.swap(*this); return *this; }
- person M.M   schedule 19.11.2015this
и что rhs можно безопасно уничтожить. - person Evan Teran   schedule 19.11.2015