Что-то пришло мне в голову, и я думаю, что это вполне разумно, но я бы хотел, чтобы мнение людей об этом было на тот случай, если я что-то упустил. Итак, во-первых, мое понимание 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
потенциально будет жить дольше, используя обычный обмен по сравнению с версией, которая делает перемещение-конструирование / обмен.
Мысли?
«что должен делать оператор присваивания»
Я всегда нахожу лучший способ лечить &&
переменная означает, что «никого не волнует, в каком состоянии я оставляю эту переменную». Вы может отойди от этого. Вы может скопировать с него Вы может своп в это. Есть еще много вещей, которые вы можете сделать.
Ваш код правильный. &&
может быть оставлен в любом состоянии вообще (пока это разрушаемо).
Объект будет уничтожен рано или поздно (вероятно, рано), и разработчик должен знать об этом. Это важно, если деструктор delete
необработанные указатели, которые могут привести к двойному удалению, если один и тот же необработанный указатель находится в нескольких объектах.