Даже некоторые старые ответы получили 44 отзыва, я склонен не соглашаться со всеми из них. Короче говоря, я не думаю, что мы должны заботиться о underlying type
из перечисления.
Прежде всего, C ++ 03 Тип enum - это отдельный отдельный тип, не имеющий понятия знака. Так как из стандарта C ++ 03 dcl.enum
7.2 Enumeration declarations
5 Each enumeration defines a type that is different from all other types....
Итак, когда мы говорим о знаке типа enum, скажем, сравнивая 2 операнда enum с помощью оператора <
, мы на самом деле говорим о неявном преобразовании типа enum в некоторый целочисленный тип. Это знак этого интегрального типа, который имеет значение . И при преобразовании enum в целочисленный тип применяется это утверждение:
9 The value of an enumerator or an object of an enumeration type is converted to an integer by integral promotion (4.5).
И, по-видимому, базовый тип перечисления не имеет никакого отношения к Интегральному продвижению. Поскольку стандарт определяет интегральное продвижение следующим образом:
4.5 Integral promotions conv.prom
.. An rvalue of an enumeration type (7.2) can be converted to an rvalue of the first of the following types that can represent all the values of the enumeration
(i.e. the values in the range bmin to bmax as described in 7.2: int, unsigned int, long, or unsigned long.
Таким образом, становится ли тип перечисления signed int
или unsigned int
, зависит от того, может ли signed int
содержать все значения определенных перечислителей, а не базовый тип перечисления.
см. Мой связанный вопрос
Неверный знак типа перечисления C ++ после преобразования в интегральный тип