2012-02-06 36 views
16

這個臨時引用是否能夠存活足夠長的時間?

template <typename T> 
T const & foo(T const & dflt) 
    { return /* ... */ ? /* ... */ : dflt; } 

int x = foo(5); 

是否提及臨時的「生存」,直到它分配給X?

(我知道它生存,把foo()調用的持續時間,但分配讓我猶豫)

有問題的代碼有一些合法的用途爲依託常量引用在這裏,也就是我需要兩個獨立的功能

T const & foo_cr(T const & dflt); 
T const & foo_v(T dflt); 

,我想避免的(僅僅依靠不同的室內用的簽名相同的名稱似乎有點冒險給我。)

+0

什麼'...? ...:dflt;'這應該是什麼意思? 0_o – 2012-02-06 12:57:43

+1

'...'在這種情況下是「代碼與問題無關,我已將其更改爲註釋,或許這更清楚 – peterchen 2012-02-06 15:00:39

回答

14

是否提及臨時的「生存」 U它分配給x?

一般來說,是的。如果foo返回dflt,那麼對該引用(對於臨時5)的引用是有效的,直到其創建完全表達式結束爲止,也就是說,直到初始化之後。

C++ 03,12.2/3:

當實現引入了一類 具有一個非平凡的構造(12.1)的一個臨時對象,應當確保 構造函數被調用爲臨時對象。類似地,應該調用析構函數臨時使用一個不重要的析構函數(12.4)。臨時對象被作爲 評估完整表達式(1.9)的最後一步被破壞,其中(詞法)包含創建它們的 點。即使評估 以拋出異常結束,情況也是如此。

更多進來12.2/4和12.2/5,特別是這個規則的例外。

我看不到會發生什麼,當它返回...你遺漏了,但我想你沒有問這個。

+7

目前沒有指定存儲爲」x「的部分是完整表達式,參見http://llvm.org/bugs/show_bug.cgi?id=9783,然而,委員會和(有希望的)用戶強烈期望它,但與此無關,規範已經指定了* read *'foo'返回的引用(左值到右值)是完整表達式的一部分。請參閱1.9p10及其後續示例。 – 2012-02-06 12:44:29

+0

感謝您的快速回答!是的,案例是安全的 - 我只是排除它(引用通過引用傳遞的集合的元素作爲附加參數) – peterchen 2012-02-06 12:45:56

相關問題