由右值引用返回更有效?

例如:

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();