enum class (C++ 元件擴充功能)
於命名空間範圍宣告列舉,這是由一組稱為列舉程式之具名常數所組成的使用者定義型別。
所有執行階段
備註
C++/CX 和 C++/CLI 支援類似於標準 C++ enum class、但另外還加上存取範圍規範的public enum class和private enum class。 在 /clr中, C++11 允許 enum class 型別,但會產生的警告 C4472 以確保您真正想要 ISO 列舉型別而非使用 C++/CX 和 C++/CLI 型別。 如需 ISO 標準 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
列舉程式名稱的逗號分隔清單。每個列舉程式的值都是隱含透過編譯器,或明確藉由標記法 (enumeratorenumerator = constant-expression) 所定義的常數運算式。 根據預設,如果第一個列舉程式是隱含定義的,則其值為零。 每個後續隱含定義的列舉程式都會是上一個列舉程式的值 + 1。
var
(選擇性) 列舉型別變數的名稱。
備註
如需詳細資訊與範例,請參閱 Enums。
請注意,如果定義列舉程式值的常數運算式無法以 underlying-type 表示,編譯器將會發出錯誤訊息。不過,編譯器不會為了不適合基礎型別的值而報告錯誤。 例如:
如果 underlying-type 是數值,而列舉程式指定了該型別的最大值,則無法表示下一個隱含定義之列舉的值。
如果underlying-type 是 bool,而且隱含定義了兩個以上的列舉程式,則無法表示前兩個列舉程式之後的列舉程式。
如果underlying-type 是 char16,而列舉值的範圍是從 0xD800 到 0xDFFF,則可以表示這個值。 不過,由於這個值代表半個 Unicode Surrogate 字組,而且不應該出現在隔離中,因此該值在邏輯上不正確。
需求
編譯器選項:/ZW
Common Language Runtime
語法
access enum class name [:type] { enumerator-list } var;
access enum struct name [:type] { enumerator-list } var;
參數
access
列舉的存取範圍。可以是 public 或 private。enumerator-list
在列舉中,識別項 (列舉程式) 的逗號分隔清單。name
列舉的名稱。不允許匿名 Managed 列舉。type (選擇項)
識別項的基礎型別。這可以是任何純量型別,例如 int、short 或 long 的帶正負號或不帶正負號的版本。bool 或 char 也都是允許的。var (選擇項)
列舉型別變數的名稱。
備註
enum class 和 enum struct 是相等的宣告。
有兩種列舉型別:Managed 或 C++/CX。
Managed 或 C++/CX 列舉可能會定義如下,
public 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;
Managed 列舉程式名稱 (識別項) 不會插入至定義列舉所在的範圍中。列舉程式的所有參考都必須是完整 (名稱::識別項)。因此,您無法定義匿名 Managed 列舉。
標準列舉的列舉程式是強式插入封閉範圍中的。也就是說,如果有另一個符號,其名稱與封閉範圍中的列舉程式相同時,編譯器將會產生錯誤。
在 Visual C++ 2002 和 Visual C++ 2003 中,弱式插入了列舉程式 (除非另有相同名稱的識別項,否則可顯示在封閉範圍中)。
如果標準 C++ 列舉已定義 (沒有 class 或 struct),則使用 /clr 編譯會使列舉編譯為 Managed 列舉。列舉仍然含有 Unmanaged 列舉的語意。請注意,編譯器會插入 Visual C++ 編譯器可辨識的屬性 [Microsoft::VisualC::NativeEnumAttribute],以識別程式設計人員使用列舉的目的是要做為原生列舉。其他編譯器只是將標準列舉視為 Managed 列舉。
以 /clr 編譯的具名標準列舉會在組件中顯示為 Managed 列舉,可由任何其他 Managed 編譯器使用。不過,未命名的標準列舉在組件中不會是公開可見的。
在 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 中的下列項目發出做為 Managed 列舉:
void f(E)
如需有關原生列舉的詳細資訊,請參閱 C++ 列舉宣告。
如需 CLR 列舉的詳細資訊,請參閱:
需求
編譯器選項:/clr
範例
範例
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);
}
Output