私は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);
}
私が理解したことから、int
範囲(私の場合int
は4バイト)で指定された値は呼び出されdisplay(int)
、この範囲外の値はあいまいになります(コンパイラーが呼び出す関数を決定できないため)。これはint
、最小値を除くすべての値の範囲、つまり-2147483648
エラーでコンパイルが失敗する場合に有効です。
オーバーロードの呼び出し
display(long int)
があいまいです
しかし、同じ値をに取り、その値を出力するint
と、になります2147483648
。私は文字通りこの振る舞いに混乱しています。
この動作は、最も負の数が渡されたときにのみ観察されるのはなぜですか?(a short
が-32768
- と一緒に使用された場合の動作は同じです。実際には、負の数と正の数が同じ2進数表現を持つ場合)
使用するコンパイラ:g ++(GCC)4.8.5
call of overloaded ‘display(long int)’ is ambiguous
。
typeof(-2147483648) != int
。リテラルは2147483648
であり、には大きすぎるため、でありint
、long
否定されています
int j{-2147483648};
は、それがナローイング変換であると文句を言わない。それ自体、ほぼ質問に値するものです。これはおそらく、初期化でlong long
constexpr値を狭めることなどを許可することに関連し2147483647LL
ています。