你能否在某些情况下给我一个说明性的例子来证明以下陈述是有用和必要的?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);
答案 0 :(得分:11)
不,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;
}
由于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;
}
将执行移动,因此打印输出将为-1
。因此,尽管您将aa
传递给push_back
,但您仍然需要通过std::move
传递它。
答案 1 :(得分:0)
注意,Named rvalue是左值。所以你应该使用std :: forward。
#include <iostream>
#include <vector>
class MyMovableType
{
int i;
public:
MyMovableType(int val) noexcept : i(val){}
MyMovableType(MyMovableType&& r) noexcept { this->i = r.i; r.i = -1; }
MyMovableType(const MyMovableType& r) noexcept{ this->i = r.i; }
int getVal()const noexcept{ return i; }
};
int main()
{
std::vector<MyMovableType> vec;
MyMovableType a(10);
MyMovableType&& aa = std::move(a);
vec.push_back( std::forward<decltype(a)>(aa) );
std::cout << a.getVal() << std::endl; // -1 printed.
return 0;
}