Класи перерахування ("нові перерахування", "сильні перерахування") вирішують три проблеми з традиційними переліченнями С ++:
- звичайне
enums
неявне перетворення в int
, викликаючи помилки, коли хтось не хоче, щоб перелік діяв як ціле число.
- звичайні
enums
експортують свої перечислювачі в навколишнє середовище, викликаючи зіткнення імен.
- Основний тип an
enum
не може бути вказаний, що спричиняє плутанину, проблеми сумісності та робить неможливим пряме оголошення.
enum class
("сильні перерахування") набираються і набираються масштабу:
enum Alert { green, yellow, orange, red };
enum class Color { red, blue };
enum class TrafficLight { red, yellow, green };
Alert a = 7;
Color c = 7;
int a2 = red;
int a3 = Alert::red;
int a4 = blue;
int a5 = Color::blue;
Color a6 = Color::blue;
Як показано, традиційні переліки працюють як зазвичай, але тепер ви можете за бажанням вказати ім’я переліку.
Нові переліки є "класом перечислення", оскільки вони поєднують аспекти традиційних перелічень (значення імен) з аспектами класів (обсяги членів та відсутність перетворень).
Можливість вказати базовий тип забезпечує простішу сумісність та гарантовані розміри переліків:
enum class Color : char { red, blue };
enum class TrafficLight { red, yellow, green };
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U };
Це також дозволяє прямому оголошенню переліків:
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
Базовий тип повинен бути одним із цілочисельних типів із підписом або без знака; за замовчуванням - int
.
У стандартній бібліотеці enum
класи використовуються для:
- Картування системи специфічні коди помилок: В
<system_error>
: enum class errc
;
- Показники безпеки покажчика: В
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- Помилки потоку вводу-виводу: У
<iosfwd>
:enum class io_errc { stream = 1 };
- Обробка помилок асинхронного зв'язку: У
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Деякі з них мають оператори, такі як ==
визначені.
enum class Colours
таenum class Fruits
. Тому що , коли я писав код в VS 2010. Він видає помилку"expects a defination or a tag name"
приclass
.