Каков базовый тип перечисления C++?

Мне нравятся эти NUnit, Утверждают расширения: http://svn.caffeine-it.com/openrasta/trunk/src/Rasta.Testing/AssertExtensions.cs

37
задан CodeFusionMobile 13 July 2009 в 21:13
поделиться

3 ответа

Из N4659 C ++ 7.2 / 5 :

Для перечисления, базовый тип которого не фиксирован, базовым типом является интегральный тип, который может представлять все значения перечислителя, определенные в перечислении. Если ни один целочисленный тип не может представить все значения перечислителя, это означает, что перечисление неправильно сформировано. Это определяется реализацией, какой интегральный тип используется в качестве базового типа, за исключением того, что базовый тип не должен быть больше int , если только значение перечислителя не может поместиться в int или целое число без знака . Если список перечислителей пуст, базовый тип такой, как если бы перечисление имело один перечислитель со значением 0.

39
ответ дан 27 November 2019 в 04:25
поделиться

Типом перечисления C ++ является само перечисление. Его диапазон довольно произвольный, но с практической точки зрения его базовый тип - это int .

Однако он неявно приводится к int , где бы он ни использовался.

C + +11 изменений

Это изменилось, начиная с C ++ 11, в котором были введены типизированные перечисления. Нетипизированное enum теперь определяется как имеющее ширину не менее int (и шире, если требуются большие значения). Однако, учитывая типизированное перечисление , определенное следующим образом:

enum name : type {};

Перечисление типа имя имеет базовый тип тип . Например, enum: char определяет enum той же ширины, что и char вместо int .

Далее, ] enum может быть явно ограничен следующим образом:

enum class name : type {
    value = 0,
    // ...
};

(Где имя является обязательным, но тип не является обязательным.) Перечисление , объявленное таким образом, больше не будет неявно приводиться к своему базовому типу (требующему static_cast <> ) и значения должны указываться с полностью определенным именем. В этом примере, чтобы присвоить значение переменной enum , вы должны ссылаться на нее как на name :: value .

45
ответ дан 27 November 2019 в 04:25
поделиться

IIRC он представлен в памяти как int . Но в gcc есть переключатель -fshort-enum , чтобы сделать его кратчайшим целочисленным типом, подходящим для всех значений, если вам нужно сэкономить место. В других компиляторах будет нечто подобное.

1
ответ дан 27 November 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: