C のオーバーロードされた関数に負の整数値の最大値を渡すと、値を直接出力すると正しく動作するにもかかわらず、あいまいさエラーが発生するのはなぜですか?

Patricia Arquette
リリース: 2024-10-31 21:24:02
オリジナル
785 人が閲覧しました

Why does passing the most negative integer value to an overloaded function in C   lead to an ambiguity error, even though printing the value directly works correctly?

最も負の整数値に対するあいまいな関数のオーバーロード

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!