8

完全に合理的だと思う何かが私に起こりましたが、何かが完全に欠けている場合に備えて、人々の意見を求めています. 最初に、私の理解でT& operator=(T&& rhs)は、完了時にの内容が何であるかは気にせずrhs、内容が移動されthisrhs安全に破壊可能であるということです。

そうは言っても、スワップが安価であると仮定すると、コピー代入演算子の一般的な例外セーフ実装は次のようになります。

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 を実行するバージョンと比較して、単純なスワップを使用すると、所有するものが潜​​在的に長く存続することです。

考え?

4

1 に答える 1