代碼示例
const int func() { int j = 8; return j; }
int main() { int i = 5; i = func(); } // 編譯通過
核心解釋
const int func() 表示**返回值是一個右值常量**(prvalue),調用者**不能修改這個臨時對象**;
i = func() 是**用常量值初始化/賦值給變量 i**,屬於「值拷貝」,目標變量 i 本身非 const,完全合法;
- 類比:
const int c = 10; int x = c; 同理合法——常量值賦給非常量變量,只讀性質不傳遞給目標對象。
易混淆場景對比
| 代碼 | 合法性 | 原因 |
const int& ref = func(); | ✅ | const 左值引用可綁定右值,延長生命周期 |
int& ref = func(); | ❌ | 非 const 左值引用不能綁定右值 |
const int* p = &func(); | ❌ | 不能取右值地址 |
int x = func(); | ✅ | 值拷貝,本文場景 |
最佳實踐
- 返回內置類型(
int、double 等)時,**不要加 const** —— 無意義,C++11 起甚至會被忽略;
- 返回**用戶定義類型**(Class/Struct)時,若不想允許
func().mutatingMethod(),可返回 const T;
- 現代 C++ 推薦:返回值直接按值返回,依賴 RVO/移動語義,無需額外
const 修飾。