帶有負整數文字的模糊函數重載
在C 中,函數重載允許多個具有相同名稱但不同簽名的函數。但是,某些情況可能會導致不明確的函數重載,從而導致編譯錯誤。在處理最大負整數值時,這種行為特別有趣。
考慮以下程式碼:
void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; } int main() { int i = -2147483648; cout << i << endl; // will display -2147483648 display(-2147483648); }
如預期的那樣,對 cout 的呼叫成功將 i 的值列印為 -2147483648 。然而,呼叫display(-2147483648) 會遇到錯誤:
call of overloaded display(long int) is ambiguous
有趣的是,這種行為對於最大負整數值來說是唯一的,並且由於C 中整數文字的一個有趣特徵而產生了歧義。在 C 中,負整數文字並非作為獨立實體存在。相反,它們表示為應用於正整數文字的一元減運算子 (-)。這意味著 -2147483648 被解釋為 -1 * 2147483648。
由於 2147483648 超出了 int 的範圍,因此在評估過程中將其提升為 long int。因此,當編譯器嘗試解析函數呼叫時,它會遇到兩個可能可行的重載:
這種歧義會導致編譯錯誤。
要解決此問題並確保預期的行為,建議使用 std::numeric_limits 實用程式來取得以可移植且明確的方式指定特定類型的最小值或最大值:
std::numeric_limits<int>::min(); // or max()
以上是為什麼在 C 中使用最大負整數值時函數重載會變得不明確?的詳細內容。更多資訊請關注PHP中文網其他相關文章!