嘗試將拷貝構造函數參數寫為值傳遞(S(const S st))時,編譯器會直接報錯:invalid constructor; you probably meant 'S (const S&)'。這並非任意限制,而是為了避免「無限遞迴」的邏輯死結。
假設允許值傳遞:
class S {
int a;
public:
S(int x) : a(x) {}
S(const S st) { this->a = st.a; } // 值傳遞
};
當執行 S s2(s1); 時:
s2 的拷貝構造函數,參數 st 需以值傳遞方式初始化。st,編譯器需再次呼叫拷貝構造函數(將 s1 複製給 st)。使用 const S& 時,參數直接綁定到現有物件,不產生新物件,自然不會觸發拷貝構造函數,從而終結遞迴鏈。
const T&)。= default 或顯式刪除(= delete)來控制拷貝語意。理解此機制,不僅能避免編譯錯誤,更能深入掌握 C++ 物件模型的核心邏輯。