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

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.所以,尽管你要传递aapush_back你,你仍然需要通过它std::move.

  • 第一个测试是不确定的,顺便说一下.移动`std :: string`不需要将原始字符串保留在任何特定状态.它只需要有效,并且它具有相同的原始值是完全没问题的. (4认同)
  • 所以在这个上下文中,`std :: string &&`与`std :: string&`相同?这是标准的定义吗? (2认同)
  • @Haatschii:是的,一个名为rvalue-references的是左值. (2认同)