2016-04-17 22 views
1

私はムーブコンストラクタを実装するクラスBarを持っています。オブジェクトをfoo(Bar &&)関数に移動する

インスタンスBar bの場合、void fooRvalRef(Bar&&)fooRvalRef(std::move(b))と呼ぶと、Barの移動コンストラクタは呼び出されません。

一方、関数void foo(Bar)の場合は、foo(std::move(b))を使用して呼び出すと、Barの移動コンストラクタが呼び出されます。

なぜですか?

+0

[なぜ 'std :: move'という名前の' std :: move'ですか?](http://stackoverflow.com/q/21358432/3953764) –

答えて

3

std::moveは、引数をrvalue参照に変換しようとしますが、それはすべて実行され、オブジェクトは移動しません。 fooRvalRef呼び出しで成功したため、移動コンストラクタは必要ありません。単にrvalue参照をrvalue-referenceパラメータに渡します。

foo(Bar)の場合、値渡しのため、通常はコピーコンストラクタが呼び出されます。しかし、この場合、移動コンストラクタがあり、std::moveのおかげで右辺値参照を渡しているので、移動コンストラクタが呼び出されます。

関連する問題