Подтвердить что ты не робот

Вывод С++ начинается с 0?

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

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

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

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

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

Ответ 1

В соответствии с этим стандартом [dcl.enum]

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

Акцент на мине

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

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

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

Ответ 2

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

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

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