負の整数リテラルによるあいまいな関数のオーバーロード
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 つのオーバーロードが発生します。
このあいまいさによりコンパイル エラーが発生します。
この問題を解決し、意図した動作を保証するには、std::numeric_limits ユーティリティを使用して取得することをお勧めします。移植可能かつ明確な方法での特定の型の最小値または最大値:
std::numeric_limits<int>::min(); // or max()
以上がC で最も負の整数値を使用すると関数のオーバーロードがあいまいになるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。