私は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 longconstexpr値を狭めることなどを許可することに関連し2147483647LLています。

