В следующем коде вместо f(unsigned)
выбрана перегрузка f(int)
. Протестировано с помощью 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] r-значение перечислимого типа может быть преобразовано в r-значение целочисленного типа.
Согласно [over.best.ics], ранг стандартной последовательности преобразования, содержащей только целое преобразование, - «Преобразование».
[over.ics.rank] Две неявные последовательности преобразования одной и той же формы являются неотличимыми последовательностями преобразования, если не применяется одно из следующих правил: [...]
Кажется, что ни одно из упомянутых правил не применимо при сравнении двух стандартных последовательностей преобразования.
Что мне не хватает?
enum
по умолчанию имеет базовыйint
, поэтому я подозреваю, что это преобразование лучше. Если вы скажете ему использоватьshort
илиchar
, готов поспорить, вы получите ожидаемую двусмысленность. - person Mooing Duck   schedule 23.07.2013std::underlying_type
, чтобы определить базовый тип перечисления. - 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