c++ integer implicit-conversion unsigned-integer integer-promotion

c++ - ¿Por qué esta función es ambigua?



integer implicit-conversion (1)

Estoy leyendo el estándar e intentando descubrir por qué este código no se resolverá sin un elenco.

void foo(char c) { } // Way bigger than char void foo(unsigned long int) { } int main() { foo(123456789); // ambiguous foo((unsigned long int) 123456789); // works }

Esto es lo que dice:

4.13 Rango de conversión de enteros [conv.rank]

Cada tipo entero tiene un rango de conversión entero definido de la siguiente manera:

- El rango de cualquier tipo de entero sin signo será igual al rango del tipo de entero con signo correspondiente.

- El rango de char será igual al rango de char firmado y char sin signo.

En particular, lo que cruje mis trampas es que no dice CUALQUIER tipo integral sin signo, solo sin signo. Mi suposición es que el carácter de char se está promocionando a un tipo sin firmar a través de la conversión. ¿Es esto cierto?


Tiene poco que ver con el rango del tipo definido en 4.13. 4.13 rankings internos definidos utilizados para describir las promociones integrales y las conversiones aritméticas habituales. Ellos por sí mismos no afectan directamente la resolución de sobrecarga. Los rankings relevantes para la resolución de sobrecarga se definen en "13.3.3.1.1 Secuencias de conversión estándar" y luego se usan en "13.3.3.2 Ranking de secuencias de conversión implícitas".

Entonces, se trata del rango de la conversión como se define en 13.3. 123456789 es un literal entero de tipo int en su plataforma. Esto significa que llamar tanto a unsigned long versiones unsigned long char como a las unsigned long requiere una conversión implícita de int a char o de int a unsigned long . En ambos casos, tenemos conversiones del tipo de "conversión integral". Eso significa que ambas funciones son igualmente "malas" en este caso. De ahí la ambigüedad.

Si una de estas funciones requiere una mera promoción integral (en oposición a la conversión integral), ganaría la resolución y la llamada se consideraría inequívoca. Pero, por desgracia, ambas funciones requieren conversiones integrales.