重新訪問臨時物件的生命週期
提供的程式碼片段展示了 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() 傳回的臨時變數的「c_str()」指標仍然有效?常識可能表明應該在呼叫 bar() 之前銷毀臨時物件。然而,事實並非如此。
根據 C 標準,臨時物件的生命週期會延長,直到詞法上包含建立該物件的右值的完整表達式的求值完成為止。這意味著在給定的程式碼中, foo() 傳回的臨時物件將保持活動狀態,直到對 bar() 的呼叫完成後。
為了形象化這個概念,請考慮以下內容:
____________________ full-expression ranges from 'b' to last ')' bar(foo().c_str()); ^^^^^ ^ | | birth funeral
臨時物件是在呼叫 foo() 時創建的(表示為「誕生」)。它在整個表達式的求值過程中保持活動狀態,在本例中是函數呼叫 bar(foo().c_str())。一旦函數呼叫完成,臨時物件就會被銷毀(表示為“葬禮”)。
以上是為什麼 C 臨時字串的 `c_str()` 在函數呼叫後仍然有效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!