大部分の負の整数に対するオーバーロード解決の曖昧さ
C では、関数のオーバーロードにより、複数の関数が同じ名前で異なるパラメーターの型を持つことができます。ただし、オーバーロードされた関数呼び出しを解決するときに、コンパイラが呼び出すのに最も適切な関数を決定できない場合、あいまいさが生じる可能性があります。
整数値と符号なし整数値を表示するための関数のオーバーロードを示す次のコードを検討してください。
<code class="cpp">void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; }
私たちの理解によれば、int に指定された範囲内の整数値は display(int) を呼び出す必要がありますが、この範囲外の値は曖昧さを引き起こします。ただし、表示するために最も負の int 値 (-2147483648) を渡そうとすると、コンパイラはエラーを発生させます:
call of overloaded display(long int) is ambiguous
この驚くべき動作は、 C に負の整数リテラルが存在しないことに起因します。 C 標準で定義されている整数リテラルには、「-」文字は含まれません。代わりに、「-」の後に数字が続く場合、コンパイラはそれを正の整数リテラルに適用される単項否定演算子として扱います。
この場合、「-2147483648」は「-1 *」として解釈されます。 2147483648」。 '2147483648' は int の範囲を超えているため、long int に昇格されます。現在、display(int) と display(long int) の両方が関数呼び出しの実行可能な候補であるため、この型の昇格はあいまいさをもたらします。
このようなあいまいさを回避するには、std::numeric_limits クラスを使用することをお勧めします。移植可能な方法でさまざまなデータ型の最小値または最大値を取得します:
<code class="cpp">std::cout << std::numeric_limits<int>::min() << endl;</code>
以上がオーバーロードされた関数に最も負の整数を渡すと C であいまいさが生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。