2013-02-04 22 views
15

は検討thisコード:組み込み型には移動セマンティクスがありますか?

#include <iostream> 
using namespace std; 

void Func(int&& i) { 
    ++i; 
} 

int main() { 
    int num = 1234; 
    cout << "Before: " << num << endl; 
    Func(std::move(num)); 
    cout << "After: " << num << endl; 
} 

その出力がある:

Before: 1234 
After: 1235 

明らかに、iFunc内部に変更され、r値に "変換" された後iをパラメータにバインドされますstd::moveによる参照。

まあ、私のポイント:

オブジェクトを移動すると、他に一つのオブジェクトからの資源の所有権を移すことを意味します。ただし、組み込みタイプは、それ自体がリソースであるため、リソースを保持しません。保持しているリソースを転送するのは意味がありません。この例に示すように、numの値が変更されます。そのリソース、すなわち自己は、変更されているリソースです。

組み込み型には移動セマンティクスがありますか?

また、ビルトインされた型オブジェクトは、定義された振る舞いをした後に移動されますか?

+1

何に応じてですか?オブジェクトを移動すると、あるオブジェクトから別のオブジェクトへのリソースの所有権が移譲されるため、元の(ソース)オブジェクトは定義されていない状態になり、そのオブジェクトで使用できる唯一の安全で有効な操作です。それらのオブジェクトの内容を読み取る操作は、未定義の値を返す可能性があります。」* – Nawaz

+0

@ Nawaz私がSOで読んだことによると。 –

+3

'std :: move'は動かない。あなたの例では、出力間の移動は1つしかありません。 –

答えて

37

この例では、明確な動作が示されていますか?

はい、この例で示す動作は、標準で許可されている唯一の動作です。これは、std::moveが動かないためです。移動するものは、コンストラクタを移動して代入演算子を移動することです。

すべてstd::moveは、左辺値をxvalueに変更するため、右辺値参照にバインドできます。コンストラクタなどは呼び出されません。値カテゴリの変更は、タイプレベルで行われます。 Nothingは実行時に発生します。

Rvalue参照はまだ参照です。それらは元のオブジェクトを参照します。この関数は、与えられた参照によって元の整数をインクリメントします。

関数が参照によって引数を取る場合、コピーも移動も起こりません。元のオブジェクトは参照にバインドされます。

関数が引数で引数を取る場合、に移動する可能性があります。

ただし、基本型には移動コンストラクタがありません。この場合、移動はコピーに劣化します。

+2

+1すてきな答え。 – Nawaz

関連する問題