その移動のコンストラクタを意味し、割り当て機能を移動し、暗黙的にはいそうですコンパイラ
によって定義することはできません。
ですので、移動操作はできません。
右辺値は常にconst&
にバインドされる可能性があるため、ノー、移動操作は、まだコピーコンストラクタを介して行うことができ、(これは、あなたが期待する場合ではないかもしれないが)代入演算子をコピーします。
さらに正確には、クラスcopyable
は、まだMoveConstructibleとMoveAssignableです。右辺値式をバインドすることができますconstのT &引数をとるコピーコンストラクタ:
クラスは、このタイプの要件を満たすために移動コンストラクタを実装する必要はありません。
MoveConstructibleクラスは移動のコンストラクタを実装している場合、それはまた、施工後のRVの値が指定されていないという事実を利用するために移動セマンティクスを実装することができます。
と
タイプがこのタイプの要件を満たすために、移動代入演算子を実装する必要はありません、値またはconst型&としてそのパラメータを取るコピー代入演算子を、バインドしますrvalue引数に。
MoveAssignableクラスが移動代入演算子を実装している場合、それはまた、譲渡後のRVの値が指定されていないという事実を利用するために移動セマンティクスを実装することができます。
@Curiousが指摘したように、あなたは移動コンストラクタを宣言し、copyable
が移動不能にするために、明示的代入演算子deleteを移動することができます。 rvalue式を使用して、delete
の過負荷が選択され、コンパイルが失敗します。
移動は、元の変数を保存する必要がない特殊なケースと見ることができます。元の変数(コピーなど)を保持しても、移動は無効になりません。 – Bernard
related/dupe:https://stackoverflow.com/questions/33939644/understanding-stdis-move-constructible – NathanOliver
Bernardのコメントにもう少し詳しく説明する:移動後、ソース変数は必ず空であるとは限りません。 (いくつかのオブジェクトには "空"という概念もないかもしれません)。以前はターゲット変数(割り当ての場合)にあった値を持つことができました。std :: stringの場合は、移動前に長い文字列だった場合は空であることが多く、短い文字列だった場合は変更されません。 –