将局部变量声明为rvalue-reference是无用的,例如T&安培;&安培; r = move(v)?

时间:2013-09-12 13:57:57

标签: c++ c++11 scope move-semantics rvalue-reference

你能否在某些情况下给我一个说明性的例子来证明以下陈述是有用和必要的?

AnyTypeMovable   v;
AnyTypeMovable&& r = move(v);

2 个答案:

答案 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;

}