enum class (C++/CLI a C++/CX)

Deklaruje výčet v oboru názvů, což je uživatelem definovaný typ skládající se ze sady pojmenovaných konstant nazývaných enumerátory.

Všechny moduly runtime

Poznámky

C++/CX a C++/CLI podporují veřejnou třídu výčtu a soukromou třídu výčtu, která se podobá standardní výčtové třídě jazyka C++, ale s přidáním specifikátoru přístupnosti. V části /clr je povolen typ třídy výčtu C++11, ale vygeneruje upozornění C4472, což je určené k zajištění, že opravdu chcete typ výčtu ISO, a ne typ C++/CX a C++/CLI. Další informace o klíčovém slově ISO Standard C++ enum naleznete v tématu Výčty.

prostředí Windows Runtime

Syntaxe

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

Parametry

Přístup
Přístupnost výčtu, který může být public nebo private.

enumeration-identifier
Název výčtu.

podkladový typ
(Volitelné) Základní typ výčtu.

(Volitelné. pouze prostředí Windows Runtime) Základní typ výčtu, který může být , , , , , uint16, int, , int64uint32nebo uint64. int16char16charbool

enumerator-list
Seznam názvů výčtů oddělených čárkami

Hodnota každého enumerátoru je konstantní výraz, který je buď definován implicitně kompilátorem, nebo explicitně notací enumerátor =konstantní výraz. Ve výchozím nastavení je hodnota prvního enumerátoru nulová, pokud je implicitně definována. Hodnota každého dalšího implicitně definovaného výčtu je hodnota předchozího výčtu + 1.

var
(Volitelné) Název proměnné typu výčtu.

Poznámky

Další informace a příklady naleznete v tématu Výčty.

Všimněte si, že kompilátor generuje chybové zprávy, pokud konstantní výraz, který definuje hodnotu enumerátoru, nemůže být reprezentován podkladovým typem. Kompilátor ale neohlásí chybu pro hodnotu, která je pro podkladový typ nevhodná. Příklad:

  • Pokud je podkladový typ číselný a enumerátor určuje maximální hodnotu pro tento typ, nelze reprezentovat hodnotu dalšího implicitně definovaného výčtu.

  • Pokud je booltyp podkladu a více než dva enumerátory jsou implicitně definovány, enumerátory za prvními dvěma nelze reprezentovat.

  • Pokud je char16typ podkladového typu a výčtová hodnota se pohybuje od 0xD800 do 0xDFFF, může být hodnota reprezentována. Hodnota je však logicky nesprávná, protože představuje polovinu náhradní dvojice Unicode a neměla by se objevit izolovaně.

Požadavky

Možnost kompilátoru: /ZW

CLR (Common Language Runtime)

Syntaxe

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

Parametry

Přístup
Přístupnost výčtu. Může to být buď public nebo private.

enumerator-list
Čárkami oddělený seznam identifikátorů (výčtů) v výčtu.

Jméno
Název výčtu. Anonymní spravované výčty nejsou povoleny.

type
(Volitelné) Základní typ identifikátorů. Může to být libovolný skalární typ, například podepsané nebo nepodepsané verze int, shortnebo long. bool nebo char je také povolen.

var
(Volitelné) Název proměnné typu výčtu.

Poznámky

Enum – třída a struktura výčtu jsou ekvivalentní deklarace.

Existují dva typy výčtů: spravované nebo C++/CX a standard.

Spravovaný výčet nebo výčet C++/CX může být definován následujícím způsobem:

public enum class day {sun, mon };

a je sémanticky ekvivalentní:

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

Standardní výčet může být definován takto:

enum day2 { sun, mon };

a je sémanticky ekvivalentní:

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

Spravované názvy enumerátoru (identifikátory) se nevkládají do oboru, ve kterém je definován výčet. Všechny odkazy na výčty musí být plně kvalifikované (identifikátor názvu::). Z tohoto důvodu nelze definovat anonymní spravovaný výčet.

Výčty standardního výčtu se silně vloží do ohraničujícího oboru. To znamená, že pokud je v nadřazeném oboru jiný symbol se stejným názvem jako enumerátor, kompilátor vygeneruje chybu.

V sadě Visual Studio 2002 a Visual Studio 2003 byly enumerátory slabě vloženy (viditelné v uzavřeném oboru, pokud nebyl jiný identifikátor se stejným názvem).

Pokud je definován standardní výčt C++ (bez class nebo struct), kompilace s /clr způsobí, že výčet se zkompiluje jako spravovaný výčet. Výčet má stále sémantiku nespravovaného výčtu. Všimněte si, kompilátor vloží atribut, Microsoft::VisualC::NativeEnumAttribute aby identifikoval záměr programátora pro výčtu jako nativní výčt. Ostatní kompilátory jednoduše uvidí standardní výčet jako spravovaný výčt.

Pojmenovaný standardní výčet zkompilovaný /clr pomocí bude viditelný v sestavení jako spravovaný výčet a může ho využívat jakýkoli jiný spravovaný kompilátor. Nepojmenovaný standardní výčet však nebude veřejně viditelný ze sestavení.

V sadě Visual Studio 2002 a Visual Studio 2003 se jako typ parametru funkce používá standardní výčet:

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

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

by pro podpis funkce vygeneroval v jazyce MSIL následující:

void f(int32);

V aktuálních verzích kompilátoru se však standardní výčet vygeneruje jako spravovaný výčet s atributem [NativeEnumAttribute] a následujícím kódem jazyka MSIL pro podpis funkce:

void f(E)

Další informace o nativních výčtech naleznete v tématu C++ – deklarace výčtu.

Další informace o výčtech CLR najdete tady:

Požadavky

Možnost kompilátoru: /clr

Příklady

// 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);
}
no automatic conversion to int: b

convert to int: 1

1

1

Viz také

Přípony komponent pro .NET a UPW