Nel seguente codice, il sovraccarico f(int)
viene scelto al posto di f(unsigned)
. Testato con clang 3.0 e gcc 4.8.Cosa rende enum -> int una conversione migliore di enum -> unsigned?
enum E
{
};
E f(int);
int f(unsigned);
E e = f(E(0));
La mia lettura della norma mi portano a pensare che enum -> int
e enum -> unsigned
sono identiche sequenze di conversione standard che entrambi contengono solo un integrale conversione.
[conv.integral] Un valore di un tipo di enumerazione può essere convertito in un valore di un tipo intero.
Secondo [over.best.ics], il rango di una sequenza di conversione standard contenente solo una conversione integrale è "Conversione".
[over.ics.rank] Due sequenze conversione implicita della stessa forma sono sequenze di conversione indistinguibili se non applicare una delle seguenti regole: [...]
Nessuna delle norme citate sembrano da applicare quando si confrontano le due sequenze di conversione standard.
Cosa mi manca?
'enum' ha un' int' sottostante di default, quindi sospetto sia per questo che la conversione sia migliore. Se dite di usare un 'short' o' char', scommetto che otterrete l'ambiguità che vi aspettate. –
Devi usare ['std :: underlying_type'] (http://en.cppreference.com/w/cpp/types/underlying_type) per capire il tipo sottostante dell'enum. –
Promozione integrale. In realtà non è una conversione integrale; vedere [conv.prom] – dyp