6

比方說,我有一個函數:返回值是通過C++ 0x中的右值引用傳遞的嗎?

typedef std::vector<int> VecType; 
VecType randomVector(); 

int processing() 
{ 
    VecType v = randomVector(); 
    return std::accumulate(v.begin(), v.end(), 0); 
} 

確實的C++ 0x說具體的虛假副本將從randomVector的返回值是可以避免的?或者編譯器是否需要實現RVO?在我看來,像值randomVector()應被視爲一個右值,從而五世的移動構造函數應該叫,但我不能完全肯定這是真的。

+0

不是一個好問題,恕我直言。該標準不能有用地陳述實現可能做什麼,而只是它必須做什麼。 – 2009-08-22 21:15:59

+0

實際上,在你給出的例子中,返回值優化是由大多數編譯器執行的......所以它沒有右值是有效的。 還右值是向函數傳遞參數更加重要。 – Artyom 2009-08-23 07:40:21

+0

問題的標題有點誤導。你的函數返回一個右值而不是引用。但是一個右值引用可以綁定到它,這是發生什麼情況下複製elision不能執行出於某種原因,並且該類型有一個移動構造函數(移動構造函數的參數是一個右值引用) – sellibitze 2009-09-27 08:19:29

回答

7

的規則如下

  • 如果編譯器可以做視網膜靜脈阻塞,則允許這樣做,並沒有複製,沒有移動而成。
  • 否則,適當的構造函數取。

像你說的,暫時是一個右值,因此,轉移構造函數被選中,是因爲在13.3.3.2/3的規則,它說,一個右值引用結合右值比左值參考更好的。在決定是否使用移動或複製構造函數時,重載解析會優先使用移動構造函數。

編譯器被允許執行RVO在12.8/15編寫的規則。

2

所有的返回值都被認爲是rvalues因此,如果編譯器不會在這種情況下,必須使用移動構造函數,而不是拷貝構造函數實現RVO。

+1

我不知道如何解釋「必須使用此舉」。 AFAIU假設編譯器支持U/NRVO,其決策流程如下: 1)如果RVO友好,優化任何移動/複製操作,2)否則如果移動construtor可用,使用它 3)否則如果複製構造函數可用,使用它 4)其他格式不正確的程序 – mloskot 2010-05-27 14:15:10

+0

@mloskot我的意思是移動構造函數被選中,因爲它比複製構造函數更適合重載。 – Motti 2010-05-27 20:00:50

+2

明白了。對我而言,隱含的假設是不清楚的。移動ctor被選中,但只有存在。 – mloskot 2010-05-28 07:15:31

相關問題