你们能给我一个在特定情况下的说明性例子来证明下面的陈述是有用的和必要的吗?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);发布于 2013-09-12 22:16:20
不,这里的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;
}将执行move,因此打印输出将为-1。因此,尽管您正在将aa传递给push_back,但您仍然需要通过std::move传递它。
发布于 2013-09-13 00:51:31
请注意,命名的右值是左值。所以你应该使用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;
}https://stackoverflow.com/questions/18766324
复制相似问题