錯誤代碼重現
const int a() { int a = 10; return a; }
int b() { int b = 5; return b; }
int main() {
const int a = 0; // 變量 a 遮蔽函數 a
int b;
a = a(); // 錯誤:嘗試調用 const int 變量
b = b(); // 正常:調用函數 b
b = a;
cout << b << endl;
}
錯誤原因
- 名稱遮蔽:局部變量
const int a = 0; 在作用域內隱藏了同名函數 a()。
- 類型不匹配:表達式
a() 中 a 被解析為 const int 變量,而非函數,無法調用,產生 C2064: term does not evaluate to a function。
const 變量初始化後不可修改,但此處錯誤發生在調用階段,而非賦值階段。
修正方案
// 方案 1:變量改名
const int a_val = 0;
int result = a(); // 調用函數 a()
// 方案 2:函數改名
const int getA() { return 10; }
const int a = 0; // 變量
int val = getA(); // 無歧義
// 方案 3:使用作用域限定(若函數在命名空間/類中)
// int val = ::a(); // 全局函數
最佳實踐
- 嚴格區分命名風格:函數用動詞/駝峰
getValue(),變量用名詞/下劃線 value_。
- 避免同一作用域內函數與變量同名。
- 啟用編譯器警告(
/W4、-Wall),可提前發現遮蔽問題。