Nawet niektóre stare odpowiedzi otrzymały 44 głosy za, nie zgadzam się ze wszystkimi z nich. Krótko mówiąc, nie sądzę, że powinniśmy przejmować underlying type
się wyliczeniem.
Po pierwsze, typ Enum w C ++ 03 jest odrębnym typem, który nie ma pojęcia o znaku. Ponieważ od standardu C ++ 03dcl.enum
7.2 Enumeration declarations
5 Each enumeration defines a type that is different from all other types....
Więc kiedy mówimy o znaku typu wyliczenia, powiedzmy, porównując 2 operandy wyliczenia przy użyciu <
operatora, w rzeczywistości mówimy o niejawnej konwersji typu wyliczenia na typ całkowity. Liczy się znak tego integralnego typu . A podczas konwersji wyliczenia na typ całkowity ma zastosowanie ta instrukcja:
9 The value of an enumerator or an object of an enumeration type is converted to an integer by integral promotion (4.5).
I najwyraźniej podstawowy typ wyliczenia nie ma nic wspólnego z promocją integralną. Ponieważ standard definiuje integralną promocję w następujący sposób:
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.
W związku z tym, czy typ wyliczeniowy staje się signed int
lub unsigned int
zależy od tego, czy signed int
może zawierać wszystkie wartości zdefiniowanych modułów wyliczających, a nie podstawowy typ wyliczenia.
Zobacz moje pokrewne pytanie
Znak typu wyliczenia w C ++ nieprawidłowy po przekonwertowaniu na typ całkowy