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)
它只是设置右值引用vp来v和别的什么也不做.另外,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.
| 归档时间: |
|
| 查看次数: |
683 次 |
| 最近记录: |