¿Cómo funcionan las reglas de promoción cuando la firma en ambos lados de un operador binario difiere? [duplicar
Esta pregunta ya tiene una respuesta aquí:
Reglas de conversión de tipo implícito en operadores C ++ 9 respuestasConsidere los siguientes programas:
// http://ideone.com/4I0dT
#include <limits>
#include <iostream>
int main()
{
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
std::cout << result;
}
// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>
int main()
{
unsigned int us = 42;
int neg = -43;
int result = us + neg;
std::cout << result;
}
¿Cómo "sabe" el operador + cuál es el tipo correcto para devolver? La regla general es convertir todos los argumentos al tipo más amplio, pero aquí no hay un "ganador" claro entreint
yunsigned int
. En el primer caso,unsigned int
debe ser elegido como resultado deoperator+
, porque obtengo un resultado de2147483648
. En el segundo caso, debe elegirint
, porque obtengo un resultado de-1
. Sin embargo, no veo en el caso general cómo esto es decidible. ¿Es este comportamiento indefinido lo que veo o algo más?