重新訪問臨時物件的生命週期
原始問題中提供的程式碼片段示範了一種看似矛盾的行為,其中foo () 傳回的臨時字串即使在進入bar() 時據稱已被銷毀,它仍然有效。
與假設,當建立臨時物件的函數完成時,臨時物件並未完全銷毀。相反,它的生命週期會延長,直到包含臨時值的整個表達式被完全求值。
為了說明這個概念,讓我們將程式碼分解為其元件:
根據C 語言規則,由foo().c_str() 產生的const char* 臨時值將持續存在,直到完整表達式bar(foo().c_str() ) 已完全評估。這意味著即使在 foo() 執行完成後,指標仍然有效。
要視覺化此行為,請想像以下時間軸:
|--------------------|-----------|-----------|-----------| | | birth | funeral | | | | ^^^ | ^^^^ | | |--------------------| | | | | | bar() | | | | | | | | |--------------------| | | | | | | | evaluated | | | | | bar() | |--------------------| | | | | | | foo() | | | | | | | |--------------------| | | |
臨時物件(字串out和const char* 指標)是在計算表達式foo().c_str()時創建的,並且它們將持續存在,直到整個表達式bar(foo().c_str()) 計算完畢。這確保了當函數嘗試存取字串時,提供給 bar() 的指標仍然有效。
因此,可以正確地假設 foo() 傳回的臨時值將在呼叫後被銷毀bar() 完成,因為這標誌著包含臨時變數的完整表達式的結束。
以上是為什麼臨時字串在創建它的函數返回後仍然有效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!