2016-05-24 4 views
0

最近cppreference.comでブラウズしていましたが、私は何も知らなかった関数this page about std::moveを発見しました。このページでStd ::コンパイラで移動保証

、明確に別段の定めがない限り、から移動してきたすべての 標準ライブラリのオブジェクトは有効ですが、不特定の状態に置かれ

ことが述べられています。

したがって、C++標準では、std::moveの後に変数の内容について何も保証されません。私を悩ましている部分は、「特に指定しない限り」です。

私が知りたいのは、GCCやVisual C++などのコンパイラが変数の内容を保証しているかどうかです。 Visual Studio 2013でstringを使用した簡単なテストでは、moveの操作後に文字列が常に空であることがわかりました。

+2

* "標準ライブラリオブジェクト" *の場合、指定された状態の移動元オブジェクトの例は 'std :: unique_ptr'です。 – LogicStuff

+0

その引用したセクションに続く例は十分にはっきりしていませんか? –

+3

std :: moveはオブジェクトに対して何もしません。渡されたオブジェクトへのrvalue参照を返します。 http://stackoverflow.com/questions/3413470/what-is-stdmove-and-when-should-it-be-used – kfsone

答えて

0

標準では、状態が定義されていないと定義されていません。 @LogicStuffが書いたように、そこから移動された後に定義された状態のタイプがあります。 std::unique_ptr<>

保証は、状態が有効であることです。つまり、すべてのメソッドを安全に呼び出すことができますが、返される内容は保証されていません。ほとんどの場合、これらのオブジェクトでデストラクタを呼び出すだけです。

また、多くの人がコメントで言ったように、移動はstd::move()で起こらないことにも注意してください。 std::move()は、それがrvalue参照として取得した参照のみを返します。コンストラクタの移動と代入演算子の移動は、パラメータとして右辺値参照を受け取り、実際の移動を行います。

その機能をstd::move()と呼び出すと、その名前だけを見ても最適ではないように見える場合があります。その使用法を見ると、その名前は完璧です。これは読者に、今度はあなたが欲しいと思っていることを伝えているからです。コピーコンストラクタではなく、呼び出されるムーブコンストラクタ。

+0

_allこれらのメソッドは安全に呼び出すことができます_。メソッド**前提条件なし**。 –

+0

@Revolver_Ocelot [OK]をクリックすると、メソッドとしてのメソッドが存在するはずです。私は、オブジェクトが存在する限り、すべてのメソッドを定義された振る舞いで呼び出すことができるということは、必ずしも完全ではない標準ライブラリであっても、ルールはそうでなければならないということです。ここで定義されているとは、オブジェクトのすべての有効な状態を意味します。オブジェクトがその状態にどのように到達したかは含まれません。 – cdonat

関連する問題