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

Patricia Arquette
リリース: 2024-10-30 06:36:03
オリジナル
162 人が閲覧しました

Why Does Function Overloading Become Ambiguous When Using the Most Negative Integer Value in C  ?

負の整数リテラルによるあいまいな関数のオーバーロード

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);
}
ログイン後にコピー

予想どおり、cout の呼び出しは i の値を -2147483648 として正常に出力します。 。ただし、display(-2147483648) の呼び出しでは次のエラーが発生します:

    call of overloaded display(long int) is ambiguous
ログイン後にコピー

興味深いことに、この動作は最も負の整数値に特有であり、C の整数リテラルの興味深い特性により曖昧さが生じます。 。 C では、負の整数リテラルは独立したエンティティとして存在しません。代わりに、正の整数リテラルに適用される単項マイナス演算子 (-) として表現されます。これは、-2147483648 が -1 * 2147483648 として解釈されることを意味します。

2147483648 は int の範囲を超えているため、評価時に long int に昇格されます。その結果、コンパイラーが関数呼び出しを解決しようとすると、実行可能な 2 つのオーバーロードが発生します。

  • display(int) with -1 as the argument
  • display(long int) with引数として 2147483648 を使用します

このあいまいさによりコンパイル エラーが発生します。

この問題を解決し、意図した動作を保証するには、std::numeric_limits ユーティリティを使用して取得することをお勧めします。移植可能かつ明確な方法での特定の型の最小値または最大値:

std::numeric_limits<int>::min();  // or max()
ログイン後にコピー

以上がC で最も負の整数値を使用すると関数のオーバーロードがあいまいになるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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