Estou aprendendo sobre sobrecarga de função em C ++ e me deparei com o seguinte:
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);
}
Pelo que entendi, qualquer valor dado no int
intervalo (no meu caso int
é 4 bytes) será chamado display(int)
e qualquer valor fora desse intervalo será ambíguo (já que o compilador não pode decidir qual função chamar). É válido para toda a gama de int
valores excepto o seu valor mínimo, isto é, -2147483648
onde a compilação falha com o erro
chamada de sobrecarregado
display(long int)
é ambígua
Mas pegar o mesmo valor para um int
e imprimir o valor dá 2147483648
. Estou literalmente confuso com esse comportamento.
Por que esse comportamento é observado apenas quando o número mais negativo é passado? (O comportamento é o mesmo se a short
for usado com -32768
- de fato, em qualquer caso onde o número negativo e o número positivo têm a mesma representação binária)
Compilador usado: g ++ (GCC) 4.8.5
call of overloaded ‘display(long int)’ is ambiguous
.
typeof(-2147483648) != int
. O literal é 2147483648
, que é muito grande para um int
, então é um long
, e está sendo negado
int j{-2147483648};
é uma conversão de estreitamento. Quase vale a pena uma pergunta, isso. Provavelmente está relacionado a permitir (por exemplo) long long
valores constexpr como 2147483647LL
estreitos na inicialização.