由右值引用返回更有效?
例如:
Beta_ab&& Beta::toAB() const { return move(Beta_ab(1, 1)); }
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();
它会将临时构build到ab
,或者做RVO来完全忽略移动或复制。 我build议你阅读解释这个问题的BoostCon09 Rvalue References 101 ,以及(N)RVO如何碰巧与之交互。
你的情况下返回一个右值引用在其他场合是一个好主意。 想象一下,你有一个你经常在临时调用的getAB()
函数。 使它返回左值临时对象的常量左值引用是不理想的。 你可以像这样实现它
struct Beta { Beta_ab ab; Beta_ab const& getAB() const& { return ab; } Beta_ab && getAB() && { return move(ab); } };
请注意,在这种情况下move
不是可选的,因为ab
既不是本地自动也不是临时右值。 现在, ref-qualifier &&
表示第二个函数是在右值临时对象上调用的,而不是复制
Beta_ab ab = Beta().getAB();