He actualizado mi MSVC a 16.7 y ahora se queja del siguiente código:

error C2668: ... llamada ambigua a función sobrecargada

void f(int){
}

void f(double){
}

int main()
{   
    long l = 5;
    static_assert(sizeof(long)==4,"");
    f(l);
}

Solía ​​compilar en compiladores más antiguos. https://godbolt.org/z/PG7GTY

Entiendo por qué GCC y Clang se quejan, ya que su longitud es de 8 bytes, pero ¿por qué MSVC rechazaría este código cuando la longitud en MSVC es de 32 bits, también conocida como int.

¿El estándar C ++ requiere que esto sea ambiguo, o está bien que la implementación considere un int para propósitos de resolución de sobrecarga si son del "mismo tipo subyacente"?

Si importa, estoy compilando con el indicador C ++ 20 en MSVC.

2
NoSenseEtAl 24 ago. 2020 a las 17:00

1 respuesta

La mejor respuesta

Primero, el compilador busca una función que se pueda llamar sin conversión implícita. Si encuentra exactamente uno, lo llama.

Si no encuentra ninguno, busca una función que se pueda llamar con una conversión implícita. En su ejemplo, ambas funciones necesitan exactamente una conversión implícita. Eso hace que el código sea ambiguo.

El tamaño de los tipos es absolutamente irrelevante.

https://en.cppreference.com/w/cpp/language/overload_resolution#Viable_functions

7
Thomas Sablik 24 ago. 2020 a las 17:55