現象
void fun(const string &s); // OK: fun("hello")
void fun(string &s); // Error: fun("hello")
標準規定
C++ Primer 5th §2.4.1:當引用類型與實參類型不匹配,且引用是 const 左值引用時,編譯器會創建一個臨時對象(類型為引用指向的類型),用實參初始化該臨時對象,再將引用綁定到臨時對象。
過程
- `"hello"` 類型為 `const char[6]`,隱式轉換為 `std::string` 臨時對象。
- `const string&` 綁定到該臨時對象,延長其生命周期至引用作用域結束。
- 非 const 引用 `string&` 不能綁定到臨時對象(C++ 標準禁止),故編譯錯誤。
實踐建議
- 函數參數若不需修改,優先用 `const T&`,接受字面量、臨時對象、具名變量。
- 需修改則用 `T&`,調用方必須傳入具名左值。
- C++11 起可用 `string_view` 避免臨時對象構造開銷。