sto leggendo lo standard e cercare di capire il motivo per cui questo codice non sarà risolto senza un cast.Perché questa funzione è ambigua?
void foo(char c) { }
// Way bigger than char
void foo(unsigned long int) { }
int main()
{
foo(123456789); // ambiguous
foo((unsigned long int) 123456789); // works
}
Qui è quello che dice:
4,13 intero rango di conversione [conv.rank]
Ogni tipo intero ha un grado di conversione intero definito come segue:
- The il rango di qualsiasi tipo intero senza segno corrisponde al grado del tipo intero con segno corrispondente di .
- Il rango di carattere deve essere uguale al rango di char firmato e unsigned char.
In particolare, quali fruscii miei jimmies è che non dice qualsiasi tipo intero senza segno, proprio unsigned char. La mia ipotesi è che il char venga promosso a un tipo senza segno tramite la conversione. È vero?
Forse 123456789U sarebbe farlo per voi. – WhozCraig
"In particolare, ciò che frulla i miei jimmies è che non dice QUALSIASI tipo integrale senza segno, solo caratteri non firmati. La mia ipotesi è che il char venga promosso a un tipo non firmato tramite conversione." È vero? " - Mi azzarderei a fraintendere il significato di 4.13 nello Standard ... 'char' non viene promosso a' unsigned' ... il problema è come dice AndreyT - che 123456789 è un 'int' ed è non è chiaramente meglio troncarlo come un 'char' o passarlo come un' unsigned long' ('long' sarebbe altrettanto sbagliato -' unsigned' non è significativo qui). –
Nonostante il nome, il "rank di conversione dei numeri interi" non è in realtà utilizzato per classificare le conversioni dei numeri interi durante la risoluzione di sovraccarico. –