完全に合理的だと思う何かが私に起こりましたが、何かが完全に欠けている場合に備えて、人々の意見を求めています. 最初に、私の理解でT& operator=(T&& rhs)
は、完了時にの内容が何であるかは気にせずrhs
、内容が移動されthis
、rhs
安全に破壊可能であるということです。
そうは言っても、スワップが安価であると仮定すると、コピー代入演算子の一般的な例外セーフ実装は次のようになります。
T& operator=(const T& rhs) {
if(this != &rhs) {
T(rhs).swap(*this);
}
return *this;
}
したがって、移動代入演算子を実装する 1 つの自然な方法は次のようになります。
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
は、move-construct/swap を実行するバージョンと比較して、単純なスワップを使用すると、所有するものが潜在的に長く存続することです。
考え?