2009-07-12 19 views

回答

165
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 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-預選賽&&說,第二個函數被調用的右值臨時工,進行以下動作,而不是拷貝

Beta_ab ab = Beta().getAB(); 
+32

我一直以爲懸掛引用問題就走了自動的,當返回類型爲一個r值參考。很高興我在咬我之前就把它弄直了。堆積砸爛的臭吮吸。 – 2009-07-15 03:03:40

相關問題