91
A
回答
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();
相關問題
- 1. 是否有任何理由將一個返回值作爲右值引用?
- 2. 右值引用時深返回
- 3. 回用右值引用
- 4. 返回值是通過C++ 0x中的右值引用傳遞的嗎?
- 5. 函數返回值和右值引用結合
- 6. 函數的右值引用和返回值
- 7. 返回無效的引用
- 8. 在Perl函數中引用更好的返回值嗎?
- 9. node.js APIs是否對參數引用有效,還是隻對返回值有效?
- 10. Swift可以從異步無效返回塊返回值嗎?
- 11. C++:通過引用返回值返回
- 12. 如何通過右值引用返回工作?
- 13. 返回Func <bool>或返回bool的方法更有效嗎?
- 14. 返回值無效
- 15. 方法返回值基元的協方差。它有效嗎?
- 16. htaccess返回引用返回沒有值的某些匹配
- 17. C++引用和返回值
- 18. C++返回值,引用,常量引用
- 19. 方法結果由值聲明,通過引用實現有效嗎?
- 20. 擁有更高效的代碼返回
- 21. 有沒有從複製賦值運算符中不返回*的有效理由?
- 22. 經由__get通過引用返回NULL()
- 23. 從存儲過程有效返回值
- 24. 用於返回值和返回值的Java習語或庫有效性?
- 25. 右值引用允許懸空引用嗎?
- 26. 返回無效或引用自我?
- 27. UISearchBar becomeFirstResponder返回0,但有有效的引用UISearchBar
- 28. 使用$索引來比較由ng-repeat返回的值
- 29. 將左值綁定到右值引用移動ctor和函數返回
- 30. 爲什麼得到的std ::的元組返回右值引用,而不是值
我一直以爲懸掛引用問題就走了自動的,當返回類型爲一個r值參考。很高興我在咬我之前就把它弄直了。堆積砸爛的臭吮吸。 – 2009-07-15 03:03:40