Перечисление является отдельным целочисленным типом ($$R.3.6.1)с константами-именами. Его имя в своей области видимости становитсяконструкцией имя-перечисления, т.е. служит зарезервированным словом. имя-перечисления: идентификатор спецификация-перечисления: enum идентификатор opt { список-перечисления } список-перечисления: элемент-перечисления список-перечисления, элемент-перечисления элемент-перечисления: идентификатор идентификатор = выражение-константаВсе идентификаторы из списка-перечисления считаются описаннымикак константы и могут появляться всюду, где требуются константы.Если не было элементов перечисления с =, то значения константначинаются с нуля и последовательно увеличиваются на единицупо мере продвижения в списке слева направо. Если элементперечисления встретился с =, то его идентификатор принимает заданноезначение, а последующие идентификаторы без инициализирующей частибудут получать возрастающие значения, начиная с заданного. Значениеэлемента перечисления должно быть типа int или значением, котороеможно привести к int с помощью стандартных целочисленныхпреобразований ($$R.4.1). Имена элементов перечисления должны быть отличны от имен обычныхпеременных и других элементов перечисления той же областивидимости. Значения элементов перечисления не обязаны отличатьсядруг от друга. Считается, что элемент перечисления описан с моментапоявления его идентификатора или инициализирующего значения,(если оно есть). Например, в определениях enum { a, b, c=0 }; enum { d, e, f=e+2 }; значения a, c, и d заданы как 0, b и e как 1, а f как 3. Каждое перечисление является целочисленным типом, которыйотличен от всех других целочисленных типов. Типом элемента перечислениясчитается данное перечисление. Значение элемента перечисления илиобъекта типа перечисления преобразуется к целому с помощьюстандартных целочисленных преобразований ($$R.4.1). Например,в следующем фрагменте: enum color { red, yellow, green=20, blue }; color col = red; color* cp = &col; if (*cp == blue) //... color задан как целочисленный тип, описывающий разные цвета,col описан как объект этого типа, а cp как указатель на объектэтого типа. Возможными значениями объекта типа color являютсяred, yellow, green, blue. Эти значения можно преобразоватьв целые значения 0, 1, 20 и 21. Поскольку каждое перечисление - этоотдельный тип, объекту типа color можно присваивать только значениятипа color, например, color c = 1; // ошибка: несоответствие типов // нет преобразования от int в color int i = yellow; // нормально: yellow преобразуется в int со значением 1 // стандартное целочисленное преобразование Обратитесь также к $$R.18.3. Элементы перечисления, определенные в классе ($$R.9), относятсяк области видимости этого класса, и к ним можно обращаться извнефункций-членов этого класса только с помощью явного уточненияименем класса ($$R.5.1). Имя самого типа перечисления локальнов этом классе ($$R.9.7), например, class X { public: enum direction { left='l', right='r' }; int f(int i) { return i==left? 0: i==right? 1: 2; } }; void g(X* p) { direction d; // ошибка: `direction' вне int i; // области видимости i = p->f(left); // ошибка: `left' тоже невидим i = p->f(X::right); // нормально //... }