29

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

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

2 回答 2

14

不,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值(如R. Martinho FernandesXeo所述-命名的 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. 因此,尽管您正在传递aapush_back,但您仍然需要通过std::move.

于 2013-09-12T14:16:20.173 回答
1

请注意,命名右值是左值。所以你应该使用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;

}
于 2013-09-12T16:51:30.713 回答