有没有返回RValue Reference(&&)有用的情况?

tow*_*owi 73 c++ rvalue-reference move-semantics c++11

函数应该返回RValue Reference是否有原因?技巧,技巧,或成语或模式?

MyClass&& func( ... );
Run Code Online (Sandbox Code Playgroud)

我知道一般返回引用的危险,但有时我们会这样做,不管我们(T& T::operator=(T)只是一个惯用的例子).但是怎么样T&& func(...)?我们会从中获得这样的一般场所吗?与仅仅客户端代码相比,当编写库或API代码时,可能会有所不同?

How*_*ant 57

有几次它是合适的,但它们是相对罕见的.当您希望允许客户端从数据成员移动时,在一个示例中出现这种情况.例如:

template <class Iter>
class move_iterator
{
private:
    Iter i_;
public:
    ...
    value_type&& operator*() const {return std::move(*i_);}
    ...
};
Run Code Online (Sandbox Code Playgroud)

  • 一个很好的例子.模式是,你*希望*客户代码*移动*某事 - 让他"偷".当然是. (5认同)
  • 通常,当在std :: lib中使用时,从对象移动必须满足为其使用的std :: lib的任何部分指定的所有要求.std定义的类型必须另外保证它们从状态移动是有效的.客户端可以使用该对象调用任何函数,只要其函数调用的值没有前置条件即可. (3认同)
  • 使用`value_type`而不是`value_type &&`作为返回类型会不会更安全? (3认同)
  • 最后,在上面的示例中,没有移动的对象.std :: move不动.它只会转换为右值.客户端可以从该右值移动(或不移动).如果客户端取消引用move_iterator两次,而不干预迭代器遍历,那么该客户端将只访问一个移动值. (2认同)

Cli*_*ton 17

这跟随了towi的评论.您永远不想返回对局部变量的引用.但你可能有这个:

vector<N> operator+(const vector<N>& x1, const vector<N>& x2) { vector<N> x3 = x1; x3 += x2; return x3; }
vector<N>&& operator+(const vector<N>& x1, vector<N>&& x2)    { x2 += x1; return std::move(x2); }
vector<N>&& operator+(vector<N>&& x1, const vector<N>& x2)    { x1 += x2; return std::move(x1); }
vector<N>&& operator+(vector<N>&& x1, vector<N>&& x2)         { x1 += x2; return std::move(x1); }
Run Code Online (Sandbox Code Playgroud)

这应该防止所有情况下的任何副本(和可能的分配),除非两个参数都是左值.

  • 那些返回调用不需要使用std :: move()吗? (2认同)

Pup*_*ppy 7

不.只需返回值.一般来说,返回引用并不危险 - 它返回对局部变量的引用是危险的.然而,返回一个右值参考在几乎所有情况下都是毫无价值的(我猜你是在写std::move什么东西).

  • 我认为在C++ 0x的早期设计中,曾经有人提出像*move-assign*和`T && operator +(const T&,T &&)`这样的东西应该返回一个`&&`.但现在,在最终草案中,这种情况已经消失.这就是我问的原因. (5认同)