首頁 >後端開發 >C++ >為什麼臨時字串在創建它的函數返回後仍然有效?

為什麼臨時字串在創建它的函數返回後仍然有效?

Patricia Arquette
Patricia Arquette原創
2024-12-14 16:31:11106瀏覽

Why Does a Temporary String Remain Valid After the Function That Created It Returns?

重新訪問臨時物件的生命週期

原始問題中提供的程式碼片段示範了一種看似矛盾的行為,其中foo () 傳回的臨時字串即使在進入bar() 時據稱已被銷毀,它仍然有效。

與假設,當建立臨時物件的函數完成時,臨時物件並未完全銷毀。相反,它的生命週期會延長,直到包含臨時值的整個表達式被完全求值。

為了說明這個概念,讓我們將程式碼分解為其元件:

  • 臨時輸出是在 foo() 函數中建立。
  • 表達式 foo().c_str() 然後存取 out 的 c_str() 成員並傳回一個臨時值const char* 指標。

根據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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn