Perché MSVC 16.7 tratta il sovraccarico di funzioni che implica la conversione da long a int ambiguo?
Ho aggiornato il mio MSVC a 16.7 e ora si lamenta del seguente codice:
errore C2668: ... chiamata ambigua alla funzione sovraccarica
void f(int){
}
void f(double){
}
int main()
{
long l = 5;
static_assert(sizeof(long)==4,"");
f(l);
}
Si compilava nei vecchi compilatori https://godbolt.org/z/PG7GTY
Capisco perché GCC e Clang si lamentano, dal momento che il loro long è di 8 byte, ma perché MSVC dovrebbe rifiutare questo codice quando long su MSVC è a 32 bit, ovvero come int.
Lo standard C ++ richiede che questo sia ambiguo o va bene per l'implementazione considerare long come int ai fini della risoluzione dell'overload se sono "lo stesso tipo sottostante".
Se è importante, sto compilando con il flag C ++ 20 su MSVC.
Risposte
Per prima cosa il compilatore cerca una funzione che possa essere chiamata senza conversione implicita. Se ne trova esattamente uno lo chiama.
Se non ne trova, cerca una funzione che possa essere chiamata con una conversione implicita. Nel tuo esempio entrambe le funzioni richiedono esattamente una conversione implicita. Ciò rende il codice ambiguo.
La dimensione dei tipi è assolutamente irrilevante.
https://en.cppreference.com/w/cpp/language/overload_resolution#Viable_functions