Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
这会返回一个悬空引用,就像左值引用的情况一样。函数返回后,临时对象将被破坏。你应该回来Beta_ab
按值,如下所示
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
现在,它正在正确地移动一个临时的Beta_ab
对象转换为函数的返回值。如果编译器可以,它将通过使用 RVO(返回值优化)来完全避免移动。现在,您可以执行以下操作
Beta_ab ab = others.toAB();
它将把临时建筑移入ab
,或者执行 RVO 以完全省略移动或复制。我推荐你阅读BoostCon09 右值参考文献 101 https://www.boostpro.com/trac/wiki/BoostCon09/RValue101这解释了这个问题,以及 (N)RVO 如何与之相互作用。
在其他情况下,返回右值引用的情况是一个好主意。想象一下你有一个getAB()
您经常在临时调用的函数。让它返回右值临时值的 const 左值引用并不是最佳选择。你可以这样实现
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
注意move
在这种情况下不是可选的,因为ab
既不是本地自动右值也不是临时右值。现在引用限定符 &&
表示在右值临时对象上调用第二个函数,进行以下移动,而不是复制
Beta_ab ab = Beta().getAB();