2011-11-15 20 views
7

此輸出F~,但我期待~F不是最重要的常量..但這是什麼?

#include <iostream> 

struct Foo { 
    int _x; 
    operator const int &() const {return _x;} 
    ~ Foo() {std :: cout << "~";} 
}; 

void foo (const int &) 
{ 
    std :: cout << "F"; 
} 

int main() 
{ 
    foo (Foo()); 
} 

我寫這個作爲一個反例表明,最重要的const的是一個例外,而不是規則。它通常寫爲

當const引用結合該臨時的一個臨時的,那麼壽命

延伸到參考

我試圖說明的壽命,雖然Foo()是暫時的,轉換運算符返回的_x的引用不是,並且上面的代碼是不安全的。

但是輸出似乎證明的例子是安全,臨時Foo()的生命週期通過對其成員之一的const引用的存在而擴展。

這是正確的?這在標準中是在哪裏指定的?

+0

返回引用是往往比一個好一個壞主意。這是一個很好的例子。 –

+0

@ R.MartinhoFernandes所以你聲明'operator []'爲...? – curiousguy

回答

6

的一般規則,對於臨時工,就是當充分表達他們末端部分(達到;時非正式地)他們的生活結束。

12.2臨時對象

3/ [...]臨時對象被銷燬作爲評價全表達式(1.9),該(詞法)的最後一步包含該點在那裏它們被創造。即使評估以拋出異常結束,情況也是如此。破壞臨時對象的值計算和副作用僅與全表達式相關,而不與任何特定的子表達式相關聯。

1

這是因爲臨時存活函數調用的整個過程。當你做foo (Foo());這裏發生了什麼:

  1. 臨時Foo是池莉構建,然後
  2. operator const int&被稱爲上的臨時
  3. foo()被調用,這個輸出F
  4. 一次foo()返回臨時Foo被破壞,此輸出~
+0

詳細說明:只要'foo'不存儲引用,代碼就是安全的。 –

1

這裏沒有魔法。所有函數參數都位於調用者的範圍內,包括臨時對象。臨時Foo()在調用者的範圍內構建,並在行尾處銷燬。

所以不管功能foo()確實發生之前它的參數在main()被銷燬。

0

但是您的Foo實例在這裏總是要活到分號結束它創建的語句。將對成員的引用傳遞給函數調用並沒有改變這一點。

嘗試:

int const &ref = Foo(); 
foo(ref); 

Foo const &ref = Foo(); // or function returning temp 
foo(ref); 
相關問題