Поделиться через


enum class (расширения компонентов C++)

Объявляет перечисление, которое является определяемым пользователем типом, состоящим из набора именованных констант, называемых перечислителями.

Все среды выполнения

Заметки

C++/CX и C++/CLI поддерживают public enum class и private enum class, которые похожи на стандартный класс перечисления C++, но с добавлением спецификатора уровня доступа.Дополнительные сведения о старом стандартном ключевом слове C++ enum см. раздел Объявления перечисления C++.

Среда выполнения Windows

Синтаксис

access enum class enumeration-identifier [:underlying-type] { enumerator-list } [var];
access enum struct enumeration-identifier [:underlying-type] { enumerator-list } [var];

Параметры

  • access
    Уровень доступа перечисления, который может иметь значение public или private.

  • enumeration-identifier
    Имя перечисления.

  • underlying-type
    (Необязательно) Базовый тип перечисления.

    (Необязательно.Только Среда выполнения Windows) Базовый тип перечисления, который может быть bool, char, char16, int16, uint16, int, uint32, int64 или uint64.

  • enumerator-list
    Разделенный запятыми список имен перечислителей.

    Значение каждого перечислителя — константное выражение, которое или определяется неявно компилятором, или явно нотацией, enumerator=constant-expression.По умолчанию значение первого перечислителя ноль, если он определен неявно.Значение каждого следующего неявно определенного перечислителя — значение предыдущего перечислителя + 1.

  • var
    (Необязательно) Имя переменной типа перечисления.

Заметки

Дополнительные сведения и примеры см. в разделе Перечисления.

Обратите внимание, что компилятор выводит сообщения об ошибках, если константное выражение, задающее значение перечислителя, не может быть представлено underlying-type.Однако компилятор не сообщает об ошибке для значения, недопустимого для базового типа.Например:

  • Если underlying-type числовой, и перечислитель определяет максимальное значение для указанного типа, то нельзя представить значение следующего неявно указанного перечисления.

  • Если underlying-type является bool, и более двух перечислителей определены неявно, то нельзя представить перечислители после первые двух.

  • Если underlying-type является char16, и значение перечисления в диапазоне от 0xD800 до 0xDFFF, то значение можно представить.Однако логически значение неверно, поскольку оно представляет половину пары символов-заместителей Юникода и не должно отображаться в изоляции.

a6cskb49.collapse_all(ru-ru,VS.110).gifТребования

Параметр компилятора: /ZW

Среда CLR

Синтаксис

access enum class name [:type] { enumerator-list } var;
access enum struct name [:type] { enumerator-list } var;

Параметры

  • access
    Уровень доступа перечисления.Может быть либо public, либо private.

  • enumerator-list
    Разделенный запятыми список идентификаторов (перечислителей) в перечислении.

  • name
    Имя перечисления.Анонимные управляемые перечисления не допускаются.

  • type (необязательный параметр)
    Базовый тип identifiers.Это может быть любой скалярный тип, например знаковые и беззнаковые версии int, short или long.bool или char также разрешены.

  • var (необязательный параметр)
    Имя переменной типа перечисления.

Заметки

enum class и enum struct являются эквивалентными объявлениями

Существует два типа перечислений: управляемые и стандартные.

Управляемое перечисление может быть определено следующим образом,

enum class day {sun, mon };

и семантически эквивалентно:

ref class day {
public:
   static const int sun = 0;
   static const int mon = 1;
};

Стандартное перечисление может быть определено следующим образом:

enum day2 {sun, mon, };

и семантически эквивалентно:

static const int sun = 0;
static const int mon = 1;

Управляемые имена перечислителей (identifiers) не вводятся в область, в которой определяется перечисление; все ссылки на перечислители должны быть полными (name::identifier).По этой причине нельзя определить анонимное управляемое перечисление.

Перечислители стандартного перечисления строго вводятся во внешнюю область.То есть, если есть другой символ с таким же именем, как у перечислителя во внешней области видимости, компилятор сгенерирует ошибку.

В Visual C++ 2002 и Visual C++ 2003 перечислители были слабо вводимыми (видимыми во внешней области, пока не появится другого идентификатора с таким же именем).

Если указано стандартное перечисление C++ (без class или struct), то компилирование с параметром /clr приведет к компиляции перечисления как управляемого.Перечисление по-прежнему имеет семантику неуправляемого перечисления.Обратите внимание, что компилятор вставляет атрибут, Microsoft::VisualC::NativeEnumAttribute, который компилятор Visual C++ распознает для определения намерения программиста сделать перечисление собственным.Другие компиляторы просто увидят стандартное перечисление как управляемое перечисление.

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

В Visual C++ 2002 или Visual C++ 2003 стандартное перечисление использовалось в качестве типа в параметре функции:

// mcppv2_enum.cpp
// compile with: /clr
enum E { a, b };
void f(E) {System::Console::WriteLine("hi");}

int main() {
   E myi = b;
   f(myi);
}

выдало бы в MSIL для сигнатуры функции следующее:

void f(int32);

Однако в текущих версиях компилятора стандартное перечисление выдается как управляемое перечисление с [NativeEnumAttribute], а в MSIL для сигнатуры функции выдается следующее::

void f(E)

Дополнительные сведения о неуправляемых перечислителях см. в разделе Объявление перечислений C++.

В среде разработки можно получить справку F1 по этим ключевым словам, выделив ключевое слово (например,enum class) и нажав клавишу F1.

Дополнительные сведения о перечислителях CLR см. в разделе:

a6cskb49.collapse_all(ru-ru,VS.110).gifТребования

Параметр компилятора: /clr

a6cskb49.collapse_all(ru-ru,VS.110).gifПримеры

Пример

desc

// mcppv2_enum_2.cpp
// compile with: /clr
// managed enum
public enum class m { a, b };

// standard enum
public enum n { c, d };

// unnamed, standard enum
public enum { e, f } o;

int main() {
   // consume managed enum
   m mym = m::b;
   System::Console::WriteLine("no automatic conversion to int: {0}", mym);
   System::Console::WriteLine("convert to int: {0}", (int)mym);

   // consume standard enum
   n myn = d;
   System::Console::WriteLine(myn);

   // consume standard, unnamed enum
   o = f;
   System::Console::WriteLine(o);
}Optionally, copy this sequence of tags for each example you want, then populate the text nodes. That is, after section+title("Examples")+content, insert: para+embeddedLabel ("Example")+para(sample description); code(sample); para+embeddedLabel("Output"); computerOutput(sample output, including 'br' tag instead of newlines)

Вывод

  
  
  
  

См. также

Основные понятия

Расширения компонентов для платформ среды выполнения