嘗試將複製建構子參數寫成傳值(S(const S st))時,編譯器會報錯:error: invalid constructor; you probably meant 'S (const S&)'。這不是隨意限制,而是語言機制使然。
class S {
int a;
public:
S(int x) : a(x) {}
S(const S st) { a = st.a; } // 傳值參數
};
int main() {
S s1(2);
S s2(s1); // 初始化 s2
}
S s2(s1) 呼叫複製建構子,參數 st 需初始化st 建立一個新物件st 又需要呼叫複製建構子(以 s1 為引數)S(const S& st) 只傳遞位址,不建立新物件,自然斷開遞迴鏈。這也是 C++ 標準強制要求的理由。
C++11 引入移動建構子 S(S&&),同樣採用參考(右值參考),同樣避免物件複製。核心邏輯一致:複製建構子的參數必須是參考型別。
作者:c小加