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 intintervalo (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 intvalores excepto o seu valor mínimo, isto é, -2147483648onde a compilação falha com o erro
chamada de sobrecarregado
display(long int)é ambígua
Mas pegar o mesmo valor para um inte 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 shortfor 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 longvalores constexpr como 2147483647LLestreitos na inicialização.

