最も負の整数値に対するあいまいな関数のオーバーロード
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); }</code>
関数のオーバーロードに関する理解によれば、任意の値整数範囲内 (この場合は 4 バイト) は、display(int) 関数を呼び出す必要があります。この範囲外の値を指定すると、あいまいさが生じます。ただし、このコードをコンパイルすると、次のエラーが発生します。
call of overloaded `display(long int)` is ambiguous
このエラーは、最大の負の整数値 (-2147483648) を表示関数に渡すときに発生します。奇妙なことに、同じ値を直接出力すると (6 行目に見られるように) 正しい結果が生成されます: -2147483648。この動作を理解する鍵は、 C に負のリテラルが存在しないことにあります。 C のすべての整数リテラルは、デフォルトでは符号なしとみなされます。つまり、符号プレフィックス (- または ) がありません。その結果、-2147483648 は実際には -1 * (2147483648) として扱われます。
オーバーロードされた関数の影響
2147483648 は整数の範囲 (4 バイト) を超えているため、 )、長整数に昇格されます。これは、コンパイラが既存の display(int) オーバーロードと競合する display(long int) 関数を呼び出そうとしていることを意味します。したがって、あいまいさが生じます。
解像度
このあいまいさを回避するには、 std::numeric_limits クラスを使用して型固有の最小値と最大値を取得することをお勧めします。 :
以上がC のオーバーロードされた関数に負の整数値の最大値を渡すと、値を直接出力すると正しく動作するにもかかわらず、あいまいさエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。