ホームページ  >  記事  >  バックエンド開発  >  C で最も負の整数を使用すると関数のオーバーロードがあいまいになるのはなぜですか?

C で最も負の整数を使用すると関数のオーバーロードがあいまいになるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 13:41:29482ブラウズ

Why Does Function Overloading Become Ambiguous with the Most Negative Integer in C  ?

最負の整数による関数のオーバーロードの曖昧さ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。