4

此代码按预期工作(在此处在线)。最后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;

但是如果我替换auto vp=move(v)

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

然后就不动了。相反,它复制并且两个向量最后都不为空。如图所示

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

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

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

3 回答 3

12

编辑 OP 的说明: -auto派生类型move(v)is vector<int>。请参阅C++11“自动”语义

第一个例子是这样做的:

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

第二个例子是这样做的:

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

什么std:move只是将类型转换为右值(请参阅什么是 std::move(),以及何时应该使用它?)。因此,在

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

它只是将右值引用设置vpv并且什么都不做。此外,右值引用是一个左值(它有一个名称),所以

vector<int> w(vp);

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

vp如果您创建一个右值(示例) ,它将调用移动构造函数:

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 构造函数,因为move(v)具有 type vector<int>&&,因此vp最终会窃取v.

在第二种情况下:

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

只是对.vp进行 r 值引用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 回答