logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.7.2 Описание перечисления

Перечисление является отдельным целочисленным типом ($$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); // нормально

// ...

}