enum class (C++/CLI および C++/CX)enum class (C++/CLI and C++/CX)

名前空間スコープで列挙型を宣言します。列挙型とは、列挙子と呼ばれる一連の名前付き定数で構成されるユーザー定義型です。Declares an enumeration at namespace scope, which is a user-defined type consisting of a set of named constants called enumerators.

すべてのランタイムAll Runtimes

解説Remarks

C++/CX および C++/CLI では、public enum classprivate enum class をサポートします。これらは、標準 C++ の enum class に似ていますが、アクセシビリティ指定子が追加されている点が異なります。C++/CX and C++/CLI support public enum class and private enum class which are similar to the standard C++ enum class but with the addition of the accessibility specifier. /clr では、C++11 の enum class 型を使用できますが、C++/CX と C++/CLI の型ではなく ISO の列挙型でよいかどうかを確認する警告 C4472 が生成されます。Under /clr, the C++11 enum class type is permitted but will generate warning C4472 which is intended to ensure that you really want the ISO enum type and not the C++/CX and C++/CLI type. ISO 標準 C++ の enum キーワードについて詳しくは、「列挙型」をご覧ください。For more information about the ISO Standard C++ enum keyword, see Enumerations.

Windows ランタイムWindows Runtime

構文Syntax

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

パラメーターParameters

accessaccess
列挙型のアクセシビリティ。public または private を指定できます。The accessibility of the enumeration, which can be public or private.

enumeration-identifierenumeration-identifier
列挙型の名前。The name of the enumeration.

underlying-typeunderlying-type
(省略可能) 列挙型の基になる型。(Optional) The underlying type of the enumeration.

(省略可能、(Optional. Windows ランタイムのみ) 列挙型の基になる型。boolcharchar16int16uint16intuint32int64,、または uint64 を指定できます。Windows Runtime only) The underlying type of the enumeration, which can be bool, char, char16, int16, uint16, int, uint32, int64, or uint64.

enumerator-listenumerator-list
列挙子名のコンマ区切りのリスト。A comma-delimited list of enumerator names.

それぞれの列挙子の値は、コンパイラによって暗黙的に定義された定数式か、" enumerator=constant-expression」をご覧ください。The value of each enumerator is a constant expression that is either defined implicitly by the compiler, or explicitly by the notation, enumerator=constant-expression. 既定では、最初の列挙子が暗黙的に定義されている場合、その値は 0 です。By default, the value of the first enumerator is zero if it is implicitly defined. それ以降の暗黙的に定義された列挙子の値は、前の列挙子の値に 1 を加算した値になります。The value of each subsequent implicitly-defined enumerator is the value of the previous enumerator + 1.

varvar
(省略可能) 列挙型の変数の名前。(Optional) The name of a variable of the enumeration type.

解説Remarks

使用例を含む詳細については、「 列挙型」をご覧ください。For more information, and examples, see Enums.

列挙子の値を定義する定数式が underlying-typeで表すことができない場合、コンパイラはエラー メッセージを生成します。Note that the compiler emits error messages if the constant expression that defines the value of an enumerator cannot be represented by the underlying-type. ただし、基になる型に対して値が不適切であるというエラーは生成されません。However, the compiler does not report an error for a value that is inappropriate for the underlying type. 次に例を示します。For example:

  • underlying-type が数値であり、列挙子がその型の最大値を指定する場合は、次に暗黙的に定義されている列挙型の値は表すことができません。If underlying-type is numeric, and an enumerator specifies the maximum value for that type, the value of the next implicitly defined enumeratoin cannot be represented.

  • underlying-typebool であり、3 つ以上の列挙子が暗黙的に定義されている場合、最初の 2 つの列挙子より後の列挙子は表すことができません。If underlying-type is bool, and more than two enumerators are implicitly defined, the enumerators after the first two cannot be represented.

  • underlying-typechar16であり、列挙型の値が 0xD800 から 0xDFFF の範囲にある場合、その値を表すことができます。If underlying-type is char16, and the enumeration value ranges from 0xD800 through 0xDFFF, the value can be represented. この値は Unicode サロゲート ペアの一方を表していますが、このペアは分離して表すことができないため、論理的にはこの値は正しくありません。However, the value logically incorrect because it represents half a Unicode surrogate pair and should not appear in isolation.

要件Requirements

コンパイラ オプション: /ZWCompiler option: /ZW

共通言語ランタイムCommon Language Runtime

構文Syntax

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

パラメーターParameters

accessaccess
列挙型のアクセシビリティ。The accessibility of the enum. public または private を指定できます。Can be either public or private.

enumerator-listenumerator-list
列挙型に含まれる識別子 (列挙子) のコンマ区切りのリスト。A comma-separated list of the identifiers (enumerators) in the enumeration.

namename
列挙型の名前。The name of the enumeration. 匿名のマネージド列挙型は使用できません。Anonymous managed enumerations are not allowed.

typetype
(省略可能) "識別子" の基になる型。(Optional) The underlying type of the identifiers. 符号付きまたは符号なしの intshortlong など、任意のスカラー型を指定できます。This can be any scalar type, such as signed or unsigned versions of int, short, or long. bool または char も使用できます。bool or char is also allowed.

varvar
(省略可能) 列挙型の変数の名前。(Optional) The name of a variable of the enumeration type.

解説Remarks

enum classenum struct は同等の宣言です。enum class and enum struct are equivalent declarations.

列挙型には、マネージド (C++/CX) 列挙型と標準列挙型の 2 種類があります。There are two types of enums: managed or C++/CX and standard.

マネージド (C++/CX) 列挙型は、たとえば次のように定義されます。A managed or C++/CX enum might be defined as follows,

public enum class day {sun, mon };

これは、次のコードと同じ意味です。and is semantically equivalent to:

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

標準列挙型は、たとえば次のように定義されます。A standard enum might be defined as follows:

enum day2 { sun, mon };

これは、次のコードと同じ意味です。and is semantically equivalent to:

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

マネージド列挙子の名前 (識別子) は、列挙型が定義されるスコープに挿入されません。列挙子へのすべての参照が完全修飾名であることが必要です (名前::識別子)。Managed enumerator names (identifiers) are not injected into the scope where the enumeration is defined; all references to the enumerators must be fully qualified (name::identifier). そのため、匿名のマネージド列挙型は定義できません。For this reason, you cannot define an anonymous managed enum.

標準列挙型の列挙子は外側のスコープに厳密に挿入されます。The enumerators of a standard enum are strongly injected into the enclosing scope. そのため、列挙子と同じ名前を持つ別のシンボルが外側のスコープにある場合、コンパイラはエラーを生成します。That is, if there is another symbol with the same name as an enumerator in the enclosing scope, the compiler will generate an error.

Visual Studio 2002 と Visual Studio 2003 では、列挙子は弱く挿入されていました (同じ名前の別の識別子が存在していない限り、外側のスコープで参照可能)。In Visual Studio 2002 and Visual Studio 2003, enumerators were weakly injected (visible in the enclosing scope unless there was another identifier with the same name).

C++ 標準列挙型が定義されている (class または struct は指定されていない) 場合、/clr を指定してコンパイルすると、列挙型がマネージド列挙型としてコンパイルされます。If a standard C++ enum is defined (without class or struct), compiling with /clr will cause the enumeration to be compiled as a managed enum. この列挙型のセマンティクスはアンマネージ列挙型のままです。The enumeration still has the semantics of an unmanaged enumeration. コンパイラは、その列挙型をネイティブ列挙型にするというプログラマの意図を示すために、Microsoft::VisualC::NativeEnumAttribute 属性を挿入します。Note, the compiler injects an attribute, Microsoft::VisualC::NativeEnumAttribute to identify a programmer's intent for the enum to be a native enum. 他のコンパイラは、標準列挙型を単にマネージド列挙型として認識します。Other compilers will simply see the standard enum as a managed enum.

/clr を指定してコンパイルされた名前付きの標準列挙型は、アセンブリでマネージド列挙型として参照可能であり、他のマネージド コンパイラでも実行できます。A named, standard enum compiled with /clr will be visible in the assembly as a managed enum, and can be consumed by any other managed compiler. ただし、名前のない標準列挙体は、アセンブリからパブリックに参照することができません。However, an unnamed standard enum will not be publicly visible from the assembly.

Visual Studio 2002 と Visual Studio 2003 では、標準列挙型は関数のパラメーターの型として使用されていました。In Visual Studio 2002 and Visual Studio 2003, a standard enum used as the type in a function parameter:

// 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 に次の出力を行います。would emit the following in MSIL for the function signature:

void f(int32);

ただし、現在のバージョンのコンパイラでは、[NativeEnumAttribute] を指定すると標準列挙型がマネージド列挙型として出力され、関数のシグネチャに対応して MSIL に次の出力を行います。However, in current versions of the compiler, the standard enum is emitted as a managed enum with a [NativeEnumAttribute] and the following in MSIL for the function signature:

void f(E)

ネイティブ列挙型の詳細については、「 C++ 列挙体の宣言」を参照してください。For more information about native enums, see C++ Enumeration Declarations.

CLR 列挙型の詳細については、次のページを参照してください。For more information on CLR enums, see:

要件Requirements

コンパイラ オプション: /clrCompiler option: /clr

使用例Examples

// 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

関連項目See also

.NET および UWP でのコンポーネント拡張Component Extensions for .NET and UWP