2015-01-08 37 views
8

我正在學習最新的C++ 11功能。但是,我並不完全瞭解有關rvalues的一件事。rvalues在C++中存儲在哪裏?

考慮下面的代碼:

string getText() 
{ 
    return "Fabricati diem"; 
} 

string newText = getText(); 

電話getText()創建其被複制到newText可變的r值。但是,這個右值存儲在哪裏?複製後會發生什麼?

+1

其實它不會因[返回值優化]而被複制(http://en.wikipedia.org/wiki/Return_value_optimization) – CoryKramer

+7

@Cyber​​它不能移動*和* RVO'd。它是一個或另一個,最有可能是後者。 – juanchopanza

+0

好的,你是對的。我編輯了我的評論。 – CoryKramer

回答

8

調用getText()會創建一個複製到newText變量的r值。

它可能會創建一個臨時;但是這是copy elision被允許的一種情況,因此newText更可能是由函數return直接初始化的,沒有臨時的。

但是這個右值存儲在哪裏?

這取決於編譯器在哪裏存儲臨時;該標準只規定了其使用期限。通常,它將被視爲自動變量,存儲在寄存器或函數的堆棧幀中。

複製後會發生什麼?

臨時的生命週期延伸到創建它的完整表達式的結尾(除非它用於初始化引用,在這種情況下,它會持續與引用一樣長)。所以在這裏,使用它初始化newText後立即銷燬。