c++ integer function-overloading overloading negative-number ambiguous-call

c++ - ¿Por qué el valor int más negativo causa un error sobre sobrecargas de funciones ambiguas?



integer function-overloading (3)

Este es un error muy sutil. Lo que está viendo es una consecuencia de que no haya literales enteros negativos en C ++. Si miramos [lex.icon] obtenemos que un literal entero ,

literal-entero
Opción de sufijo entero-decimal decimal
[...]

puede ser un decimal decimal ,

decimal-literal:
dígito distinto de cero
decimal-literal ''dígito opt

donde el dígito es [0-9] y el dígito distinto de cero es [1-9] y el sufijo par puede ser uno de u , U , l , L , ll o LL . En ninguna parte aquí se incluye - como parte del literal decimal.

En §2.13.2, también tenemos:

Un literal entero es una secuencia de dígitos que no tiene período ni parte de exponente, con comillas simples de separación opcionales que se ignoran al determinar su valor. Un literal entero puede tener un prefijo que especifica su base y un sufijo que especifica su tipo. El primer dígito léxico de la secuencia de dígitos es el más significativo. Un literal entero decimal (base diez) comienza con un dígito distinto de 0 y consiste en una secuencia de dígitos decimales.

(énfasis mío)

Lo que significa que - en -2147483648 es el operator - unario operator - . Eso significa que -2147483648 realidad se trata como -1 * (2147483648) . Dado que 2147483648 es demasiado para su int , se promociona a un long int y la ambigüedad proviene de que no coincide.

Si desea obtener el valor mínimo o máximo para un tipo de forma portátil, puede usar:

std::numeric_limits<type>::min(); // or max()

Estoy aprendiendo sobre la sobrecarga de funciones en C ++ y me encontré con esto:

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); }

Por lo que entendí, cualquier valor dado en el rango int (en mi caso int es de 4 bytes) llamará a display(int) y cualquier valor fuera de este rango será ambiguo (ya que el compilador no puede decidir qué función llamar). Es válido para el rango completo de valores int excepto su valor mínimo, es decir, -2147483648 donde la compilación falla con el error

la llamada de display(long int) sobrecargada display(long int) es ambigua

Pero tomar el mismo valor a int e imprimir el valor da 2147483648 . Estoy literalmente confundido con este comportamiento.

¿Por qué se observa este comportamiento solo cuando se pasa el número más negativo? (El comportamiento es el mismo si se usa un short con -32768 , de hecho, en cualquier caso donde el número negativo y el número positivo tienen la misma representación binaria)

Compilador utilizado: g ++ (GCC) 4.8.5


La expresión -2147483648 realidad está aplicando el operador - a la constante 2147483648 . En su plataforma, int no puede almacenar 2147483648 , debe estar representado por un tipo más grande. Por lo tanto, no se deduce que la expresión -2147483648 esté signed int sino un tipo con signo más grande, con signed long int .

Como no proporciona una sobrecarga por long el compilador se ve obligado a elegir entre dos sobrecargas que son igualmente válidas. Su compilador debe emitir un error de compilación sobre sobrecargas ambiguas.


Ampliando las respuestas de otros

Para aclarar por qué el OP está confundido, primero : considere la representación binaria signed int de 2147483647 , a continuación.



Luego, agregue uno a este número : dando otro signed int de -2147483648 (que el OP desea usar)


Finalmente: podemos ver por qué el OP se confunde cuando -2147483648 compila en un long int lugar de un signed int , ya que claramente cabe en 32 bits.

Pero, como mencionan las respuestas actuales, el operador unario ( - ) se aplica después de resolver 2147483648 que es un long int y NO cabe en 32 bits.