最大負整數值的模糊函數重載
在C 中,函數重載允許多個具有相同名稱但不同參數的函數。但是,當編譯器無法根據給定參數確定要呼叫哪個重載函數時,就會出現歧義。使用整數類型時,尤其是在處理最大負值時,可能會發生此問題。
考慮以下程式碼片段:
<code class="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); }
根據我們對函數重載的理解,任何值在整數範圍內(本例中為4 位元組)應呼叫display(int)函數。超出此範圍的值會導致歧義。但是,編譯此程式碼會導致下列錯誤:
call of overloaded `display(long int)` is ambiguous
將最大負整數值 (-2147483648) 傳遞給顯示函數時會出現此錯誤。奇怪的是,直接列印相同的值(如第 6 行所示)會產生正確的結果:-2147483648。
微妙之處:C 中缺乏負文字
The理解這種行為的關鍵在於 C 中沒有負文字。預設情況下,C 中的所有整數文字都被視為無符號,這表示它們沒有符號前綴(- 或 )。結果,-2147483648 實際上被視為 -1 * (2147483648)。
重載函數的意義
由於 2147483648 超出了整數範圍(4 個位元組) ),它被提升為長整數。這意味著編譯器嘗試呼叫 display(long int) 函數,這與現有的 display(int) 重載衝突。因此,出現了歧義。
解
為了避免這種歧義,建議使用std::numeric_limits 類別來取得特定於類型的最小值和最大值:
<code class="c++">std::cout << std::numeric_limits<int>::min() << endl; // displays -2147483648</code>
以上是為什麼將最大負整數值傳遞給 C 中的重載函數會導致歧義錯誤,即使直接列印該值可以正常運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!