xml*_*lmx 26 c++ scope rvalue-reference move-semantics c++11
你能否在某些情况下给我一个说明性的例子来证明以下陈述是有用和必要的?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);
Run Code Online (Sandbox Code Playgroud)
Nem*_*ric 12
不,AnyTypeMovable&& r = move(v);这根本没用.
请考虑以下代码:
#include <iostream>
#include <vector>
class MyMovableType
{
int i;
public:
MyMovableType(int val): i(val){}
MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
MyMovableType(const MyMovableType& r){ this->i = r.i; }
int getVal(){ return i; }
};
int main()
{
std::vector<MyMovableType> vec;
MyMovableType a(10);
MyMovableType&& aa = std::move(a);
vec.push_back(aa);
std::cout << a.getVal() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如aa一个l值(由R. Martinho Fernandes以及Xeo指出- 一个名为rvalue-reference的是一个左值),这将打印10表明尚未执行移动(也不在赋值中,也不在push_back调用中) ),所以你仍然需要std::move它的push_back方法,如在这种情况下:
#include <iostream>
#include <vector>
class MyMovableType
{
int i;
public:
MyMovableType(int val): i(val){}
MyMovableType(MyMovableType&& r) { this->i = r.i; r.i = -1; }
MyMovableType(const MyMovableType& r){ this->i = r.i; }
int getVal(){ return i; }
};
int main()
{
std::vector<MyMovableType> vec;
MyMovableType a(10);
MyMovableType&& aa = std::move(a);
vec.push_back(std::move(aa));
std::cout << a.getVal() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将执行移动,因此打印输出将是-1.所以,尽管你要传递aa给push_back你,你仍然需要通过它std::move.
| 归档时间: |
|
| 查看次数: |
3073 次 |
| 最近记录: |