すべてが問題です。私が試した:const/referenceメンバで唯一の移動可能なクラスを作成することはできますか?
#include <vector>
class Foo
{
int & _x;
public:
Foo(int x) :
_x(x)
{}
Foo(Foo && other) :
_x(other._x)
{}
Foo & operator=(Foo && other) = default;
private:
Foo(Foo const &) = delete;
Foo & operator=(Foo const &) = delete;
};
int main(void)
{
int a, b;
std::vector<Foo> vec;
vec.push_back(Foo(a));
vec.push_back(Foo(b));
vec.erase(vec.begin());
return 0;
}
しかしFoo & operator=(Foo && other)
はデフォルトで削除されているので、それはコンパイルできません。
私はこの演算子を削除しようとしましたが、コンストラクタをmoveで使用してコンパイラを強制的に強制しようとしましたが、コピーコンストラクタを使用しようとしました。
参照メンバでオブジェクトを移動することはできますか?
そうでない場合、なぜですか?
ありがとうございました。
編集:私はすでにMove-assignment and reference memberを読んでいますが、私の質問には答えません。なぜFoo & operator=(Foo const &)
がコンパイラで使用されているのでしょうか?Foo(Foo && other)
は動作します。
なぜ、参照メンバでクラスを移動できないのか分かりません。
参照メンバーを持つクラスは、コピーを作成して構築することはできますが、コピーの割り当てや割り当ての移動はできません。問題は移動ではなく、問題はassign(operator =) –
です。なぜstd :: vectorは演算子=を使用し、移動コンストラクタは使用しませんか?彼らは同じ行動をしていませんか? – Boiethios
いいえ1つのコンストラクトと他のアサイン。 vectorは 'push_back'にコンストラクタを使いますが、' erase'は代入が必要です。 –