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);