移动,还是不移动r值ref ref-qualified方法?

Con*_*tor 13 c++ return-value move-semantics ref-qualifier c++17

在下面的C++ 11 +代码中,返回语句构造应该是首选吗?

#include <utility>


struct Bar
{
};

struct Foo
{
    Bar bar;

    Bar get() &&
    {
        return std::move(bar); // 1
        return bar;            // 2
    }
};
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 19

好吧,因为它是一个r值ref ref合格的成员函数,this大概即将到期.所以搬出bar去是有意义的,假设Bar实际上从移动中获得了某些东西.

由于bar是成员,而不是本地对象/函数参数,因此返回语句中复制省略的通常标准不适用.它会一直复制,除非你明确std::move它.

所以我的答案是选择第一个选项.

  • 另外,根据用例,你应该为`&`和`const&`添加重载 (4认同)