什么是std :: move的类型?

Aar*_*aid 4 c++ move-semantics c++11

此代码按预期工作(在线).最后v是空的,w因为它已经窃取了内容,所以不是空的v.

    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;
Run Code Online (Sandbox Code Playgroud)

但是,如果我取代auto vp=move(v)

    vector<int> && vp = move (v);
Run Code Online (Sandbox Code Playgroud)

然后它不动.相反,它复制,两个向量最后都是非空的.如图所示这里.

澄清:更具体地说,什么是自动衍生类型vp?如果不是vector<int> &&,那还有什么呢?为什么这两个例子虽然如此相似但却给出了不同的结果?

额外:我也试过这个,它仍然复制而不是移动

    std :: remove_reference< vector<int> > :: type && vp = move(v);
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 12

编辑OP的澄清:auto-derived类型move(v)vector<int>.请参阅C++ 11"自动"语义.

第一个例子是这样的:

move 'v' into 'vp'
copy 'vp' into 'w'
Run Code Online (Sandbox Code Playgroud)

第二个例子是这样的:

set 'vp' as rvalue-reference of 'v'
copy 'vp' (which is 'v') into 'w'
Run Code Online (Sandbox Code Playgroud)

什么std:move确实是简单地铸造类型的右值(见什么是性病::移动(),什么时候应该应用它呢?).因此,在

vector<int>&& vp = move(v);
Run Code Online (Sandbox Code Playgroud)

它只是设置右值引用vpv和别的什么也不做.另外,rvalue-reference是一个左值(它有一个名字),所以

vector<int> w(vp);
Run Code Online (Sandbox Code Playgroud)

将调用复制构造函数复制vp(即v)w.

如果你做vp一个rvalue,它会调用move构造函数(例子):

vector<int> w(move(vp))
Run Code Online (Sandbox Code Playgroud)

您可能需要阅读:C++ Rvalue References Explained.

  • 但它并没有在第一个例子中调用复制构造函数.`auto vp = move(v); vector <int> w(vp)`有效(数据被盗).为什么这样做?什么是自动派生类型的vp? (2认同)