8

オブジェクトを移動した後、それは破壊可能でなければなりません:

T obj;
func(std::move(obj));
// don't use obj and let it be destroyed as normal

しかし、objで他に何ができるでしょうか?別のオブジェクトをその中に移動できますか?

T obj;
func(std::move(obj));
obj = std::move(other);

これは正確なタイプに依存しますか?(たとえば、std :: vectorは、すべてのTに対して信頼できない特定の保証を行うことができます。)すべてのタイプが、移動元のオブジェクトの破棄以外の何かをサポートする必要がありますか、それとも正気ですか?

4

5 に答える 5

6

はい、別のオブジェクトをその中に移動できます。std::swapはこれを行います。

于 2010-10-06T12:52:11.353 に答える
6

C ++ 0xの現在のドラフトでは、移動元のオブジェクトを破棄または割り当てることができる必要があります。オブジェクトを標準ライブラリの関数に渡す場合は、それだけが想定されます。

移動元のオブジェクトが、すべての不変条件を満たすそのタイプの「動作中の」オブジェクトであることを確認することは、一般的に良い習慣と考えられています。ただし、それは不特定の状態にあります---それがコンテナである場合、それが持っている要素の数やそれらが何であるかはわかりませんが、とを呼び出してクエリを実行できるはずsize()ですempty()

現在のドラフトでは、標準ライブラリタイプ自体に何が必要かについては不明であり、C++委員会で活発に議論されています。

于 2010-10-06T12:57:59.027 に答える
1

それがタイプセマンティクスです。あなたが決める。移動をどのように実装するかはあなた次第です。

一般に、状態はノンパラメトリックコンストラクターを使用して得られる状態と同じである必要があります。

ところで。moveは、データブロックをポインタ(または他の移動可能なクラス)の後ろに格納している場合にのみ意味があります。

于 2010-10-06T12:52:18.933 に答える
1

クラスコードによって異なります。クラスに右辺値参照コンストラクターと代入演算子がない場合、std::moveは無視されます。std :: moveは何も移動せず、適切な関数が使用可能な場合は、引数を右辺値参照として扱うことができます。

正しく記述された&&コンストラクターとoperator=は、パラメーターインスタンスを空の文字列などの一貫した状態のままにする必要があり、オブジェクトは使用可能である必要があります。operator =がある場合、別のオブジェクトがそのような空のインスタンスに正しく割り当てられている可能性があります。

編集。

一般に、std :: moveは、右辺値ではない変数に移動セマンティクスを適用するために使用する必要がありますが、実際には次のようになります。

SomeClass :: SomeClass(SomeClass && v)
{{
    //この関数の内部では、vはもはや右辺値ではありません。しかし、私は実際にそれを知っています
    //これは右辺値であり、std::moveを使用します
    OtherFunction(std :: move(v));
}

この場合、vの最小要件は、問題なく死ぬことができるはずであるということです。

std :: moveが実際には右辺値参照ではない変数に使用される場合、実際には、この変数のユーザビリティは未定義である可能性があります。私自身のクラスでは、この場合に何らかの一貫性を確保します。別のクラスの場合-特定のクラスの実装に依存しますが、実際には右辺値参照ではないオブジェクトにstd::moveを適用しません。これが標準でどのように定義されているか(そして定義されているかどうか)は本当にわかりません。

于 2010-10-06T12:55:23.010 に答える
0

コメントからようやくわかりました。これを確認する必要があります:http ://www.boost.org/doc/libs/1_44_0/libs/concept_check/concept_check.htm

これにより、コンセプト(タイプの機能)のテンプレートパラメーターとして提供されたタイプを確認できます。すでに可動式のものがあるかどうかはわかりません。

于 2010-10-06T13:36:01.967 に答える