использование свопа для реализации назначения перемещения

Что-то пришло мне в голову, и я думаю, что это вполне разумно, но я бы хотел, чтобы мнение людей об этом было на тот случай, если я что-то упустил. Итак, во-первых, мое понимание 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 потенциально будет жить дольше, используя обычный обмен по сравнению с версией, которая делает перемещение-конструирование / обмен.

Мысли?

2

Решение

«что должен делать оператор присваивания»

Я всегда нахожу лучший способ лечить && переменная означает, что «никого не волнует, в каком состоянии я оставляю эту переменную». Вы может отойди от этого. Вы может скопировать с него Вы может своп в это. Есть еще много вещей, которые вы можете сделать.

Ваш код правильный. && может быть оставлен в любом состоянии вообще (пока это разрушаемо).

Объект будет уничтожен рано или поздно (вероятно, рано), и разработчик должен знать об этом. Это важно, если деструктор delete необработанные указатели, которые могут привести к двойному удалению, если один и тот же необработанный указатель находится в нескольких объектах.

5

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