2014-11-24 85 views
0

this文章表示爲什麼返回值優化發生在這裏

當一個無名臨時的,不會綁定到任何引用,將被移動 或複製到相同的CV-不合格類型的對象時, 複製/移動被省略。當臨時建造時,它是直接在存儲中構建的 ,否則它將被移動 或複製到。當無名暫時是聲明返回的參數時,這種副本刪除的變體稱爲RVO,「返回值 優化」。

所以爲了測試這個概念我嘗試了以下實驗

class C 
{ 
    public: 
     C() 
     { 
      std::cout << "Constructor of C." << std::endl; 
     } 
     C(const C &) 
     { 
      std::cout << "Copy-constructor of C." << std::endl; 
     } 
}; 

C func() 
{ 
    const C c; 
    return c; //c is not a nameless and is not CV unqualified as it is a const type. 
} 

int main(int argc, char **argv) 
{ 
    C c = func(); 
} 

輸出:章C

Constrcutor我期待: 的構造ç 拷貝構造的Ç C的複製構造函數

我的問題是爲什麼返回值優化發生在這裏?

回答

2

因爲你引用了一個不相關的段落。有關的一個是上面的一個(從相同的源):

如果函數返回由值的類型,和返回語句的表達是一種非揮發性的對象具有自動存儲持續時間,其名稱不是函數參數或catch子句參數,並且與函數的返回類型具有相同的cv-unqualified類型,則複製/移動將被省略。

任何的所述條件允許複製elision。

+0

這仍然不能回答它。返回類型是一個常量,所以它不是cv不合格的,並且返回類型也不是臨時的。它在函數中創建並返回。 – MistyD 2014-11-24 04:57:07

+2

@MistyD:返回類型不是常量。你要返回的對象是。但無論如何,這是無關緊要的。該文本並不是說它需要cv不合格。它表示返回的對象的類型(除去了cv限定符)需要與該函數的返回類型相同(刪除了cv限定符)。 – 2014-11-24 05:06:59

相關問題