6

右辺値の参照と移動のセマンティクスを理解しようとしています。次のコードでは、Print 関数に 10 を渡すと、予期される右辺値参照のオーバーロードが呼び出されます。しかし、正確には何が起こるのか、その 10 はどこにコピーされるのでしょうか (またはそれが参照された場所から)。第二に、std::move実際には何をしますか?から値 10 を抽出してi渡しますか? それとも、右辺値参照を使用するようにコンパイラに指示していますか?

void Print(int& i)
{
    cout<<"L Value reference "<<endl;
}

void Print(int&& i)
{
    cout<<"R Value reference "<< endl;
}

int main()
{
    int i = 10;

    Print(i); //OK, understandable
    Print(10); //will 10 is not getting copied? So where it will stored

    Print(std::move(i)); //what does move exactly do

    return 0;
}

ありがとう。

4

3 に答える 3

9

a の場合10、実際の実装を変更する最適化が含まれる可能性がありますが、概念的には、次のことが起こります。

  • 一時的なintが作成され、値で初期化されます10

  • その一時的なintものは、右辺値参照関数パラメーターにバインドされます。

したがって、概念的には、コピーはありません。参照は一時的なものを参照します。

に関してはstd::move()、参照などに関連するいくつかのトリッキーなビットがあるかもしれませんが、主に、それはr値参照への単なるキャストです。実際には何も動かしstd::move()ませ。移動できるように、引数を右辺値に変換するだけです。

とにかく、「移動」は実際には定義された操作ではありません。移動について考えると便利ですが、重要なのは左辺値と右辺値の区別です。

「移動」は通常、移動コンストラクター、移動代入演算子、および右辺値参照を取る関数 ( などpush_back()) によって実装されます。移動を実際の移動にするのは実装です。つまり、r 値のリソースをコピーする代わりに「盗む」ことができるように実装されています。これは、r 値であるため、アクセスできなくなるためです (または、コンパイラに約束します)。

そのためstd::move()、「移動」を有効にします - 引数を右辺値に変換し、「コンパイラさん、この左辺値はもう使用しません。関数 (移動 ctor など) にそれをr-value を取得し、そこから盗みます。」

于 2013-10-01T06:17:39.260 に答える
-1

std::move経由でキャストintします。最終的に型が aまたは a の場合、移動コンストラクターが (暗黙的または明示的に) 定義されていれば、/の代わりに呼び出されます。int&&static_cast<int&&>classstructcopy constructorclassical constructor

于 2013-10-01T06:13:40.183 に答える