c++ - What makes enum -> int a better conversion than enum -> unsigned? -
in following code, overload f(int) chosen instead of f(unsigned). tested clang 3.0 , gcc 4.8.
enum e { };  e f(int); int f(unsigned);  e e = f(e(0)); my reading of standard lead me think enum -> int , enum -> unsigned identical standard conversion sequences both contain integral-conversion.
[conv.integral] rvalue of enumeration type can converted rvalue of integer type.
according [over.best.ics], rank of standard conversion sequence containing integral conversion 'conversion'.
[over.ics.rank] 2 implicit conversion sequences of same form indistinguishable conversion sequences unless 1 of following rules apply: [...]
none of rules mentioned seem apply when comparing 2 standard conversion sequences.
what missing?
c++11:
[conv.prom]/3
a prvalue of unscoped enumeration type underlying type not fixed (7.2) can converted prvalue of first of following types can represent values of enumeration (i.e., values in range b min b max described in 7.2):
int,unsigned int,long int,unsigned long int,long long int, orunsigned long long int.
(emphasis mine)
then, [over.ics.rank]/4:
standard conversion sequences ordered ranks: exact match better conversion promotion, better conversion conversion.
so, overload resolution on expression f(e(0)), overload e f(int); requires integral promotion (from e int, via [conv.prom]), has higher rank integral conversion required int f(unsigned); (from e unsigned via [conv.integral]).
for c++03, argumentation same, though first quote different: [conv.prom]/2
an rvalue of type
wchar_t(3.9.1) or enumeration type (7.2) can converted rvalue of first of following types can represent values of underlying type:int,unsigned int,long, orunsigned long.
[over.ics.rank]/4 same.
Comments
Post a Comment