臨時物件的生命週期
在C 中,臨時物件的創建有多種原因,例如從函數傳回值或計算表達式。了解臨時變數的生命週期對於正確的程序行為至關重要。
考慮以下程式碼片段:
std::string foo() { std::string out = something...; return out; } void bar(const char* ccp) { // do something with the string.. } bar(foo().c_str());
在此程式碼中,由 foo() 建立的臨時字串由呼叫 bar() 時使用 const char* 指標。問題出現了:為什麼這段程式碼有效?
答案在於臨時程式碼的生命週期。根據 C 標準,當詞法上包含創建該物件的右值的完整表達式被完全求值時,臨時物件將被銷毀。
在上面的程式碼中,完整表達式為 bar(foo().c_str ())。此表達式的計算從 '(左括號)開始,到最後一個 ')'(右括號)結束。在此表達式中,透過計算 foo() 來建立臨時字串,並在臨時字串上呼叫 c_str() 方法。
因此,臨時字串在完整表達式的開頭存在,並且是當表達式完全求值時(即調用 bar() 之後)被銷毀。這解釋了為什麼 bar() 中的 const char* 指標仍然引用有效的字串。
總之, foo() 傳回的臨時值僅在包含它的完整表達式被求值後才會被銷毀,確保foo().c_str() 傳回的指標在呼叫bar() 的過程中保持有效。
以上是C 臨時程序的壽命有多長以及為什麼此程式碼可以工作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!