臨時函數參數何時消失?
在 C 中,當建立臨時物件作為函數的參數時,編譯器會自動管理其生命週期。這就提出了一個問題:臨時物件的析構函數在什麼時候保證被呼叫?
根據 C 標準,臨時物件在它們所屬的完整表達式結束時被銷毀。這裡,完整表達式是不是另一個表達式的子表達式的表達式。它通常以控制流語句(例如 if、while、switch)的分號 (;) 或右括號 () 結尾。
在提供的範例中:
class MyClass { MyClass(int a); }; myFunction(MyClass(42));
The作為函數參數建立的臨時 MyClass 物件將在函數呼叫語句結束後(即遇到分號時)被銷毀。因此,您可以假設在執行任何後續語句之前將呼叫析構函數。
值得注意的是,可以使用 const 引用來延長臨時物件的生命週期。透過將臨時引用綁定到const 引用,其生命週期會延長以匹配引用的生命週期:
MyClass getMyClass(); { const MyClass& r = getMyClass(); // full expression ends here ... } // object returned by getMyClass() is destroyed here
此技術可以節省不必要的複製構造,同時保留函數傳回的值,尤其是在傳回值最佳化時不適用。然而,隨著 C 11 中移動語意的出現,它的實用性有所減弱。
以上是C 臨時函數參數到底什麼時候被銷毀?的詳細內容。更多資訊請關注PHP中文網其他相關文章!