最負の整数による関数のオーバーロードの曖昧さ
C では、関数のオーバーロードにより、名前は同じだがパラメーター リストが異なる複数の関数が許可されます。ただし、最も負の整数値が発生すると、暗黙的な型変換によりあいまいさエラーが発生する可能性があります。
問題の理解
次のコード スニペットは、この問題を示しています。
<code class="cpp">void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; } int main() { int i = -2147483648; cout << i << endl; // prints -2147483648 display(-2147483648); // error: ambiguous function call }
最も負の整数 (-2147483648) が display(-2147483648) に渡されると、コンパイラーは「あいまいな関数のオーバーロード」エラーを生成します。これは、コンパイラが、display(int) または display(unsigned) のどちらの関数を呼び出すかを決定できないために発生します。
整数リテラルの役割
この例は、 C に負の整数リテラルが存在しないことが原因です。整数リテラルはゼロ以外の数字で始まる必要があります。 -2147483648 の場合、負号は単項マイナス演算子として解釈され、式 -1 * (2147483648) になります。
Type Promotion
2147483648 は int の範囲を超えているため、long int に昇格します。ただし、このプロモーションでは、display(int) と display(unsigned) のパラメーターの型の間にあいまいさが生じ、エラーが発生します。
Portable Solution
移植可能な方法で型の最小値または最大値を使用できます。
<code class="cpp">std::numeric_limits<type>::min(); // or max()</code>
このメソッドを利用すると、あいまいな関数のオーバーロードが回避され、実装に関係なく正しい型の処理が保証されます。
以上がC で最も負の整数を使用すると関数のオーバーロードがあいまいになるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。