В следния код претоварването f(int)
е избрано вместо f(unsigned)
. Тестван с clang 3.0 и gcc 4.8.
enum E
{
};
E f(int);
int f(unsigned);
E e = f(E(0));
Моето четене на стандарта ме накара да мисля, че enum -> int
и enum -> unsigned
са идентични стандартни последователности за преобразуване, които и двете съдържат само интегрално преобразуване.
[conv.integral] Rvalue от тип изброяване може да се преобразува в rvalue от целочислен тип.
Според [over.best.ics], рангът на стандартна последователност на преобразуване, съдържащ само интегрално преобразуване, е „Преобразуване“.
[over.ics.rank] Две имплицитни поредици за преобразуване от една и съща форма са неразличими поредици за преобразуване, освен ако не се прилага едно от следните правила: [...]
Нито едно от споменатите правила не изглежда приложимо при сравняване на двете стандартни последователности на преобразуване.
какво ми липсва
enum
има основенint
по подразбиране, така че подозирам, че това е причината това преобразуване да е по-добро. Ако му кажете да използваshort
илиchar
, бих се обзаложил, че ще получите неяснотата, която очаквате. - person Mooing Duck   schedule 23.07.2013std::underlying_type
, за да разберете основния тип на enum. - person Kerrek SB   schedule 23.07.2013enumerations (7.2) are not integral; however, enumerations can be promoted to int, unsigned int, long, or unsigned long, as specified in 4.5.
.. но C++03 4.5 не споменава изброяване! - person willj   schedule 23.07.2013enum {Val1 = -1};
, следователно преобразуването в int е по-естествено. - person Steztric   schedule 24.07.2013enum
е различен тип и правилата за преобразуване се различават заenum
в зависимост от диапазона. Тъй като оригиналният примерenum E
няма отрицателни числа, той е предмет на различни правила от вашия пример. - person MSalters   schedule 24.07.2013