2011-03-28 30 views
10

可能重複:
C++: Life span of temporary arguments?全表達邊界和臨時對象的壽命

據說臨時變量被破壞作爲評價全表達的最後一個步驟,例如

bar(foo().c_str()); 

臨時指針生活,直到酒吧回報,但什麼的

baz(bar(foo().c_str())); 

是它仍然生活,直到酒吧的回報,或巴茲回到這裏指充分表達年底, 編譯器我查銷燬對象後巴茲回來了,但我可以依靠嗎?

+0

是的,這個問題的答案應該是http://stackoverflow.com/questions/4214153/lifetime-of-temporaries的一部分,我問了一個新的問題,因爲我沒有權利發表評論,我是對這裏沒有涉及的具體細節感興趣。 – Vasaka 2011-03-29 19:51:55

回答

10

臨時生活直到創建它們的完整表達式的末尾。 「完整表達式」是不是另一個表達式的子表達式的表達式。

baz(bar(...));,bar(...)baz(...)的子表達式,而baz(...)不是任何東西的子表達式。因此,baz(...)是完整表達式,並且在評估此表達式期間創建的所有臨時對象將不會被刪除,直到返回baz(...)之後。

+2

但是請注意,構造函數是一個特殊情況(我認爲 - 90%肯定),所以在'baz(X(foo()。c_str()));'中,其中'X'是一個類和參數到'baz'是對'X'的構造函數的調用,'c_string'的生命期將在構造函數退出時結束。 – 2013-03-17 18:09:13

3

顧名思義,全部表達式就是所有表達式,包括對baz()的調用,所以臨時會持續到調用baz()返回。