據說臨時變量被破壞作爲評價全表達的最後一個步驟,例如
bar(foo().c_str());
臨時指針生活,直到酒吧回報,但什麼的
baz(bar(foo().c_str()));
是它仍然生活,直到酒吧的回報,或巴茲回到這裏指充分表達年底, 編譯器我查銷燬對象後巴茲回來了,但我可以依靠嗎?
據說臨時變量被破壞作爲評價全表達的最後一個步驟,例如
bar(foo().c_str());
臨時指針生活,直到酒吧回報,但什麼的
baz(bar(foo().c_str()));
是它仍然生活,直到酒吧的回報,或巴茲回到這裏指充分表達年底, 編譯器我查銷燬對象後巴茲回來了,但我可以依靠嗎?
臨時生活直到創建它們的完整表達式的末尾。 「完整表達式」是不是另一個表達式的子表達式的表達式。
baz(bar(...));
,bar(...)
是baz(...)
的子表達式,而baz(...)
不是任何東西的子表達式。因此,baz(...)
是完整表達式,並且在評估此表達式期間創建的所有臨時對象將不會被刪除,直到返回baz(...)
之後。
但是請注意,構造函數是一個特殊情況(我認爲 - 90%肯定),所以在'baz(X(foo()。c_str()));'中,其中'X'是一個類和參數到'baz'是對'X'的構造函數的調用,'c_string'的生命期將在構造函數退出時結束。 – 2013-03-17 18:09:13
顧名思義,全部表達式就是所有表達式,包括對baz()
的調用,所以臨時會持續到調用baz()
返回。
是的,這個問題的答案應該是http://stackoverflow.com/questions/4214153/lifetime-of-temporaries的一部分,我問了一個新的問題,因爲我沒有權利發表評論,我是對這裏沒有涉及的具體細節感興趣。 – Vasaka 2011-03-29 19:51:55