在 C++ 中,當我們寫下 A a = A(); 這行代碼時,許多初學者會困惑:這是否會先建立一個臨時物件,再透過複製建構函數複製給 a,最後釋放臨時物件?還是它其實等價於 A a();(這其實是一個函數宣告)?
為了釐清這個問題,我們可以在建構函數與解構函數中加入輸出語句進行觀察。實際運行後會發現,建構函數與解構函數各自只被呼叫了一次。這說明並沒有產生額外的臨時物件與複製動作。
這得益於 C++ 標準允許的複製省略優化,特別是返回值優化(RVO, Return Value Optimization)。編譯器會直接在目標物件 a 的記憶體空間上建構物件,避免了不必要的複製與銷毀開銷。因此,A a = A(); 實際上直接調用了預設建構函數(或對應的建構函數)來初始化 a,行為上等同於 A a; 或 A a{};(C++11 統一初始化語法)。
A a = A(); 不會產生臨時物件再複製。a,只有一次建構與一次解構。理解這一機制有助於寫出更高效、更符合現代 C++ 風格的代碼。