4

このコードは期待どおりに機能します (オンラインはこちら)。の中身を盗んでいるので最後vは空っぽで空っぽではありません。wv

    vector<int> v;
    v.push_back(1);
    cout << "v.size(): " << v.size() << endl;
    auto vp = move(v);
    vector<int> w(vp);
    cout << "w.size(): " << w.size() << endl;
    cout << "v.size(): " << v.size() << endl;

しかし、私auto vp=move(v)

    vector<int> && vp = move (v);

すると動かない。代わりにコピーし、両方のベクトルは最後に空ではありません。ここに示すように。

明確化:より具体的には、 の自動派生型はvp何ですか? そうでない場合vector<int> &&、他に何が考えられますか? 2 つの例が非常に似ているにもかかわらず、なぜ異なる結果になるのでしょうか?

エクストラ:これも試しましたが、移動ではなくコピーされました

    std :: remove_reference< vector<int> > :: type && vp = move(v);
4

3 に答える 3

12

OPの明確化のために編集: isのauto派生型。C++11 の "auto" セマンティクスを参照してください。move(v)vector<int>

最初の例はこれを行います:

move 'v' into 'vp'
copy 'vp' into 'w'

2番目の例はこれを行います:

set 'vp' as rvalue-reference of 'v'
copy 'vp' (which is 'v') into 'w'

std:move単純に型を右辺値にキャストすることとは何ですか (std::move() とは何か、いつ使用する必要があるかを参照してください)。したがって、

vector<int>&& vp = move(v);

右辺値参照vpを設定するだけで、v他には何もしません。また、右辺値参照は左辺値 (名前がある) であるため、

vector<int> w(vp);

コピー コンストラクターを呼び出してvp(これはv) にコピーしwます。

vp右辺値を作成すると、移動コンストラクターが呼び出されます( Example ):

vector<int> w(move(vp))

あなたはこれを読みたいかもしれません: C++ Rvalue References Explained .

于 2011-12-19T01:05:18.357 に答える
2

最初のケースでは:

auto vp = move(v);

次と同等です。

vector<int> vp = move(v);

move(v)は typevector<int>&&を持っているので、これは move コンストラクターを呼び出しvpますv

2 番目のケースでは:

vector<int>&& vp = move(v);

vpへの右辺値参照を作成するだけvです。これにより、移動コンストラクターまたはコピー コンストラクターが呼び出されることはなく、何も盗まれません。

于 2011-12-19T01:16:47.490 に答える
1
auto vp = move(v);

新しいものを作成し、そのvector<int>移動コンストラクターを呼び出しています:

vector(const vector<T>&& other);

の内容を盗みvます。

したがって、「vp」のタイプは単純vector<int>です..関連する参照はありません:

vector<int> vp;

内部を「移動」しています..実際のベクトル自体ではありません。

..&vpとは異なり&vますが、内容は移動します。

于 2011-12-19T01:16:43.777 に答える