C 中的臨時物件銷毀
人們可能想知道由函數呼叫或建構函數的值參數所建立的臨時物件何時被銷毀。它們消亡的精確時間對於確定涉及臨時分配實體的代碼的正確執行至關重要。
為了說明問題,請考慮以下範例:
#include <iostream> struct Foo { const char* m_name; ~Foo() { std::cout << m_name << '\n'; } }; int main() { Foo foo{"three"}; Foo{"one"}; // unnamed object std::cout << "two" << '\n'; }
此程式碼是否會列印「一二三」?未必。此行為取決於 C 編譯器和用於編譯的特定設定。
根據 C 標準 ([class.temporary] p4),臨時物件的生命週期持續到其建立的完整表達式結束為止在提供的範例中,完整的表達式是整個 main 函數。因此,臨時 Foo 物件的銷毀發生在 main 的末尾,這符合觀察到的列印順序。
但是,[class.temporary] p5、p6 和 p7 定義了此一般規則的幾個例外。例如,可以縮短數組初始化時臨時物件的生命週期。此外,將引用綁定到臨時物件或在 for-range-initializer 中使用它可以延長其生命週期。
總之,C 中臨時物件銷毀的精確時間由標準控制。雖然在大多數情況下,臨時變數在創建它們的表達式末尾被銷毀,但某些異常和編譯器最佳化可以改變這種行為。理解這些細微差別對於編寫正確且可預測的 C 程式碼至關重要。
以上是C中的臨時物件何時被銷毀?的詳細內容。更多資訊請關注PHP中文網其他相關文章!