Форма enum без фигурных скобок - PullRequest
0 голосов
/ 05 ноября 2018

Сегодня я был свидетелем формы enum, написанной как таковой, скомпилированной в VS 2017:

enum ens en1, en2, en3;

, а затем он был использован как таковой:

int n = en2;

Так что мой вопрос в том, что это была за форма enum и почему n позже было установлено на 0?


Живой пример :

enum ens en1, en2, en3;

int main()
{
    int n = en2;
}

компилируется без предупреждения с параметрами компилятора по умолчанию

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Этот пример неверен, потому что объявление enum должно включать либо тип нижележащего элемента, либо список элементов. Это также означает, что его нельзя комбинировать с объявлением переменной. исправленный вариант:

enum ens: int; // ens is a complete type at this point
enum ens en1, en2, en3; // en1 en2 en3 are global variables of enum ens type

// alternative "traditional" enum definition with empty list of items:
enum ens{} en1, en2, en3;

int n = en2; делает n равным 0, потому что en2 является глобальной переменной и неявно инициализируется с 0.

0 голосов
/ 06 ноября 2018

Это несоответствующий код, это расширение, как мы видим , если мы используем / Za MSVC также отклоняет код.

Мы можем видеть, что это плохо сформировано из dcl.enum # 2 :

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

Эта формулировка была добавлена ​​ n2764 , которая позволяла пересылать объявления перечислений, пока указан базовый тип.

Подробнее о том, почему нам не разрешено пересылать объявления перечислений без базового типа, см. Почему должен быть указан размер перечисления при объявлении форварда?

0 голосов
/ 05 ноября 2018
enum ens en1, en2, en3;

не является объявлением enum. Это объявление переменной . Он объявляет 3 переменные типа enum ens. Они используются в коде позже.

При присвоении

int n = en2;

значение en2 имеет значение enum, соответствующее целочисленному значению 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...