Sdílet prostřednictvím


enum class (rozšíření komponent C++)

Deklaruje výčet v rozsahu oboru názvů, což je uživatelem definovaný typ tvořený sadou pojmenovaných konstant nazývaných enumerátory.

Všechny moduly runtime

Poznámky

Jazyky C++/CX a C++/CLI podporují třídy public enum class a private enum class podobné standardní třídě výčtu (enum class) jazyka C++, avšak doplněné o specifikátor přístupnosti.Podle možnosti /clr je výčtový typ ( enum class ) C++11 povolen, ale vygeneruje upozornění C4472 určené k ověření, zda opravdu chcete výčtový typu ISO a ne typ C++/CX a C++/CLI.Další informace o klíčovém slově enum jazyka C++ podle standardu ISO naleznete v tématu Deklarace výčtů v jazyce C++.

prostředí Windows Runtime

Syntax

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

Parametry

  • access
    Přístupnost výčtu, může nabývat hodnot public nebo private.

  • enumeration-identifier
    Název výčtu.

  • underlying-type
    (Volitelné) Typ, na němž je výčet založen.

    ( Volitelné.Pouze architektura prostředí Windows Runtime ) Typ, na němž je výčet založen. Hodnoty mohou být bool, char, char16, int16, uint16, int, uint32, int64 nebo uint64.

  • enumerator-list
    Čárkami oddělený seznam názvů enumerátorů.

    Hodnota každého čítače výčtu je konstantní výraz, který je buď definována implicitně kompilátorem nebo explicitně pomocí zápisu, enumerator=constant-expression. Ve výchozím nastavení je hodnota prvního enumerátoru nula, je-li implicitně definována.Hodnota každého následujícího implicitně definovaného enumerátoru je hodnota předchozího enumerátoru + 1.

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

Poznámky

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

Všimněte si, že kompilátor vydává chybové zprávy, pokud nemůže být reprezentována konstantní výraz, který definuje hodnotu čítače underlying-type. Kompilátor však nehlásí chybu u hodnoty, která pro daný typ není vhodná.Příklad:

  • Pokud underlying-type je numerická a čítač výčtu určuje maximální hodnotu pro daný typ, nelze hodnotu Další implicitně definované enumeratoin.

  • Pokud underlying-type je bool, a více než dva čítače jsou implicitně definované čítače po prvních dvou nelze vyjádřit.

  • Pokud underlying-type je char16a hodnota výčtu rozsahu 0xD800 až 0xDFFF, může být reprezentováno hodnotou.Hodnota je však logicky nesprávná, protože představuje polovinu náhradního páru znakové sady Unicode a neměla by se vyskytovat izolovaně.

Požadavky

Možnost kompilátoru: /ZW

Common Language Runtime

Syntax

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

Parametry

  • access
    Přístupnost výčtu. Může nabývat hodnoty public nebo private.

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

  • name
    Název výčtu. Anonymně spravované výčty nejsou povoleny.

  • type (volitelné)
    Příslušný typ identifikátorů. Tím může být libovolný skalární typ, například podepsaná nebo nepodepsaná verze typů int, short nebo long. Typ bool nebo char je také povolen.

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

Poznámky

Deklarace enum class a enum struct jsou ekvivalentní.

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

Spravované výčty nebo výčty jazyka C++/CX mohou být definovány následujícím způsobem

public enum class day {sun, mon };

a je sémanticky rovnocenný se zápisem:

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

Standardní výčet lze definovat následujícím způsobem:

enum day2 { sun, mon };

a je sémanticky rovnocenný se zápisem:

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

Názvy spravovaných enumerátorů (identifikátorů) nejsou vloženy do oboru, kde je výčet definován. Všechny odkazy na enumerátory musí být plně kvalifikované (název::identifikátor). Z tohoto důvodu nelze definovat anonymní spravovaný výčet.

Enumerátory standardního výčtu jsou do ohraničujícího oboru vkládány silně. To znamená, že pokud v ohraničujícím oboru existuje jiný symbol s názvem shodným s enumerátorem, kompilátor vygeneruje chybu.

V jazycích Visual C++ 2002 a Visual C++ 2003 byly enumerátory vkládány slabě (viditelné v ohraničujícím oboru, pokud se v něm nenacházel identifikátor se stejným názvem).

Je-li definován standardní výčet jazyka C++ (bez klíčového slova class nebo struct), bude při kompilaci s možností /clr tento výčet zkompilován jako spravovaný. Tento výčet má stále sémantiku nespravovaného výčtu. Povšimněte si, že pro identifikaci programátorova záměru udělat výčet nativním, kompilátor vkládá atribut [Microsoft::VisualC::NativeEnumAttribute] rozpoznatelný kompilátorem jazyka Visual C++. Jiné kompilátory uvidí běžný výčet jednoduše jako spravovaný.

Pojmenovaný, standardní výčet zkompilovaný s možností /clr bude viditelný v sestavení jako spravovaný výčet a může být využit jiným spravovaným kompilátorem. Nepojmenovaný standardní výčet však nebude v sestavení veřejně viditelný.

V jazycích Visual C++ 2002 a Visual C++ 2003 by standardní výčet použití jako typ v parametru funkce:

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

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

generoval následující kód MSIL pro signaturu funkce:

void f(int32);

Aktuální verze kompilátoru však standardní výčet emitují jako spravovaný výčet s atributem [NativeEnumAttribute] a následujícím kódem MSIL pro signaturu funkce:

void f(E)

Další informace o nativních výčtech naleznete v tématu týkajícím se deklarace výčtu v jazyce C++.

Další informace o výčtech CLR naleznete v tématech:

Požadavky

Možnost kompilátoru: /clr

Příklady

Příklad

sestupně

// 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);
} 

Výsledek

  
  
  
  

Viz také

Koncepty

Rozšíření komponent pro platformy běhového prostředí