2011 年以降、コピーとムーブの両方の割り当てがあります。ただし、この回答は、リソース管理クラスの場合、代入演算子は1つしか必要ないことを非常に説得力を持って主張しています。たとえばstd::vector
、これは次のようになります
vector& vector::operator=(vector other)
{
swap(other);
return*this;
}
ここで重要な点は、引数が値によって取得されることです。other
これは、適切な関数本体が入力された時点で、 (可能であればムーブ コンストラクターによって、そうでない場合はコピー コンストラクターによって)の構築によって多くの作業が既に行われていることを意味します。したがって、これにより、コピーと移動の両方の割り当てが自動的に正しく実装されます。
これが正しければ、なぜ (少なくともこのドキュメントによると)このように実装されてstd::vector
いないのでしょうか?
これがどのように機能するかを説明するために編集します。other
次の例で、上記のコードで何が起こるかを考えてみましょう
void foo(std::vector<bar> &&x)
{
auto y=x; // other is copy constructed
auto z=std::move(x); // other is move constructed, no copy is ever made.
// ...
}