Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';std::move的类型是什么?_C++_C++11_Move Semantics - Fatal编程技术网

C++ 什么';std::move的类型是什么?

C++ 什么';std::move的类型是什么?,c++,c++11,move-semantics,C++,C++11,Move Semantics,此代码按预期工作(联机)。 最后,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() &

此代码按预期工作(联机)。 最后,
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;
然后它就不动了。相反,它会复制,并且两个向量最后都不是空的。如图所示

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

Extra:我也尝试了这个,但它仍然复制而不是移动

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

编辑OP的澄清
移动(v)
自动
派生类型为
向量
。看

第一个示例是这样做的:

move 'v' into 'vp'
copy 'vp' into 'w'
set 'vp' as rvalue-reference of 'v'
copy 'vp' (which is 'v') into 'w'
第二个例子是这样的:

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

std:move
所做的只是将类型强制转换为右值(请参阅)。因此,

vector<int>&& vp = move(v);
将调用复制构造函数将
vp
(即
v
)复制到
w

如果将
vp
设为右值(),它将调用移动构造函数:

向量w(移动(vp)) 您可能需要阅读以下内容:

正在创建新的
向量
并调用其移动构造函数:

vector(const vector<T>&& other);
它正在“移动”内部构件。。而不是实际的向量本身

因此,
&vp
将不同于
&v
。。但是内容会在不同的位置移动。

在第一种情况下:

auto vp = move(v);
相当于:

vector<int> vp = move(v);

只需将
vp
作为
v
的r值引用即可。这不会导致调用移动构造函数或复制构造函数,也不会导致任何内容被窃取。

这并不能真正解释为什么一种方法有效,而另一种方法无效。但在第一个示例中,它并没有调用复制构造函数<代码>自动vp=移动(v);矢量w(vp)工作(数据被窃取)。为什么这样做有效?vp的自动派生类型是什么?@AaronMcDaid:它正在调用复制构造函数,而不是调用
v
。查看更新。回顾两年前我自己的问题。我可以看出,我当时的印象是
move
确实做了些什么,而且有副作用。我还假设
auto
类型将是一个引用。这两个计数都是错误的。的确,但就我所知,
vector
上的
remove\u reference
只给了我们
vector
。我尝试了
std::remove\u reference::type&&vp=move(v)并且它也不起作用。它复制,而不是移动。
vector<int> vp;
auto vp = move(v);
vector<int> vp = move(v);
vector<int>&& vp = move(v);