Перечисления C ++ начинаются с 0?

Если у меня есть enum который не присваивает номера перечислениям, будет ли его порядковый номер 0? Например:

enum enumeration { ZERO,
ONE,
TWO,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE };

Я смог найти пост со ссылкой на то, что стандарт C99 требует 0 порядкового номера. Но я знаю, что C ++ игнорирует несколько вещей в стандарте C99. И я также смог найти пост свидетельства компилятора с использованием порядкового значения 1, что-то, что я также помню, видя, хотя я не могу сказать, как давно это было.

Я действительно хотел бы увидеть ответ, который подтверждает это для C ++, но я также хотел бы знать, имеет ли место порядковый номер 0 даже если Я указываю значение в середине enum:

enum enumeration { ZERO,
ONE,
TWO,
THREE = 13,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE };

32

Решение

Согласно этому стандарту [dcl.enum]

Тип перечисления, объявленный с ключом enum только для enum, является перечислением с незаданной областью, а его перечислители являются перечислителями с незаданной областью. Enum-ключи enum class и enum struct семантически эквивалентны; тип перечисления, объявленный с одним из них, является перечислением области, и его перечислители ограничены
счетчики. Необязательный идентификатор не должен быть опущен в объявлении перечисления с областью видимости. Тип-спецификатор-seq базы перечислений должен называть целочисленный тип; любая квалификация cv игнорируется. Декларация opaqueenum, объявляющая перечисление с незаданной областью, не должна опускать enum-base. Идентификаторы в списке перечислителей объявляются как константы и могут появляться везде, где требуются константы. Определение перечислителя с = дает ассоциированному перечислителю значение, указанное константным выражением. Если первый
перечислитель не имеет инициализатора, значение соответствующей константы равно нулю.
Определение-перечислитель без инициализатора дает перечислителю значение, полученное путем увеличения значения предыдущего перечислителя на единицу.

Акцент мой

Так что да, если вы не укажете начальное значение, по умолчанию будет 0.

Я действительно хотел бы видеть ответ, который подтверждает это для C ++, но я также хотел бы знать, имеет ли место порядковый номер 0, даже если я указываю значение в середине перечисления:

Это тоже работает. Он начнется с 0 и будет увеличиваться по пути. Затем после перечисления вы присваиваете ему значение, которое начнет увеличиваться с этого значения для следующих.

33

Другие решения

Из спецификации C ++ 11 (7.2 / 2):

Если первый счетчик не имеет инициализатор, значение соответствующей константы равно нулю. переписчик-определение без инициализатор дает счетчик значение, полученное путем увеличения значения предыдущего счетчик одним.

Так что да, первый идентификатор в перечислении будет иметь нулевое значение (если оно явно не инициализировано другим значением), а каждый последующий идентификатор будет иметь значение предыдущего плюс один.

20

из п. 7.2, стр. 165

. Если первый перечислитель не имеет инициализатора, значение соответствующей константы равно нулю

источник: http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf

5
По вопросам рекламы [email protected]