2014-11-09 40 views
0

以下代碼在Visual Studio 2013中編譯時沒有任何警告。刪除最後一行中的註釋將無法編譯。這是Visual Studio 2013中的一個錯誤嗎?如果不是,我該如何在標準內理解它?引用常量臨時對象的意外行爲

我認爲允許引用臨時對象是非常危險的事情,不是嗎?

struct A 
{ 
    string a; 

    void f(const string & toMove) 
    { 
     a = toMove; 
    } 
    void g(string & toMove) 
    { 
     a = toMove; 
    } 
} aa; 

stringstream d_SS; 
d_SS << "A string"; 
aa.f(d_SS.str()); 
//aa.g(d_SS.str()); 

編輯

在這種related question,他們解釋說,一個「弄不準非const引用到臨時對象。我的問題是,爲什麼我們被允許以aa.f(d_SS.str())的方式獲得對臨時對象的const引用。 d_SS.str()在進入功能體之前就已經死了!

+0

我不明白你在這裏遇到什麼問題。一個需要'const'引用,所以傳遞一個臨時的函數是完全可以的,因爲函數無論如何都不能改變參數。 – PaulMcKenzie 2014-11-09 07:23:51

+0

@PaulMcKenzie:在我的理解中,不斷的和暫時的不是同一件事,它們並不意味着彼此。我對ravi的答案的評論表明d_SS.str()不是常量,因爲你可以修改它。 – Hector 2014-11-09 07:39:37

+0

你問爲什麼'aa.f(d_SS.str());'不會給出錯誤? – 2014-11-09 07:43:02

回答

1

d_SS.str()在進入函數體之前已經死亡!

不正確;它仍然活着,直到當前的完整表達式結束,在這種情況下,它是aa.f(d_SS.str());末尾的分號。

如果aa.f需要引用或指向其參數的指針並將其保存到某個外部數據區域,則只會存在危險。 aa.f只是讀取它的參數是完全安全的。

+0

謝謝。作爲參考,我發現這個其他[相關的問題](http://stackoverflow.com/a/2784304/2549876)。只是爲了明確:「允許引用臨時對象是非常危險的事情,不是嗎?」被回答爲:不,如果它是一個常量引用,因爲它會延長對象的生命,直到分號爲止。 – Hector 2014-11-09 08:16:19