當以常數參考 (const T&) 綁定右值 (字面常數、運算式結果、臨時物件) 時,編譯器會:
double& dr = 1; // 錯誤:非常數參考無法綁定右值
const double& cdr = 1; // 正確:延長臨時物件生命週期
// 等效過程:
double temp = double(1); // 隱式轉換建立臨時物件
const double& cdr = temp; // 綁定參考
class C {};
void f(C& c) { cout << "C&" << endl; }
void f(const C& c) { cout << "C const&" << endl; }
int main() {
f(C()); // 輸出: "C const&" - 臨時物件只能綁定 const 參考
}
void display(const int& ref) { cout << ref << '\n'; }
int main() {
int i = 1;
const int ci = 2;
display(i); // 正常
display(ci); // 正常
display(2); // 正常:綁定字面常數
display(1 + 2); // 正常:綁定運算式結果
display(static_cast(3.14)); // 正常:綁定轉換結果
}
T& my_op() {
T t;
return t; // 錯誤:t 在函數結束時銷毀,回傳懸空參考
}
const T& my_op() {
T t;
return t; // 正確:t 生命週期延長至接收端參考存活為止
}
const T& my_t_obj = my_op(); // t 存活到 my_t_obj 離開作用域
注意:此行為僅限於直接回傳區域變數,若回傳參考成員或運算式結果則不適用。
| 場景 | 推薦做法 | 理由 |
|---|---|---|
| 函數參數 (大型物件) | const T& | 避免複製成本,保證不修改原物件 |
| 函數參數 (小型物件) | 傳值 T | 現代 C++ 移動語意下傳值常更優 |
| 回傳區域物件 | T (傳值) | RVO/NRVO 最佳化 + 移動語意,最安全 |
| 回傳成員/靜態物件 | const T& | 避免複製,生命週期有保障 |
| 延長臨時物件壽命 | const T& ref = expr; | 特定演算法需求時使用 |