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