1. ホーム
  2. c++

C/C++ enum class(C++11), enum enumeration

2022-03-18 06:16:26
<パス

列挙とは、C++において、ある種の無限集合を列挙する仕組みのことです。C++11で新しくenumクラス(enum structと同じ)ができましたが、enumとはどう違うのでしょうか?

enumの特徴。

enumのメンバーは、指定されている場合は指定された値で初期化されます。指定されていない場合は、前のメンバーの値に1を加えた値になり、最初のメンバーが指定されていない場合は0になります。

  1. Shape-shiftingへの暗黙の変換。
  2. スコープの問題で、enum クラスにすでに占有されているメンバー名がある場合、それを再度定義することはできません。
  3. コンパイラによって型が異なる可能性があります。

一例として

#include 

using namespace std;
enum color {
	red,
	yellow = 4,
	blue = 0xFFFFFF00U
};

enum mycolor {
	//red,
	//not definable, as it is defined in color
	white,
	pink
};

void func(int c)
{
	cout<<"call func\n"<<<endl;
}

int main()
{
	color c(red);//red scope is visible
	func(c);//conversion occurs, enum color to int
	cout<< red << endl;
	cout<< yellow << endl;
	cout<< blue << endl;
	return 0;
}


上のような出力になります。

call func

0
4
4294967040


また、以下のような場合もあります。

call func

0
4
-1


列挙の基礎となるデータ型が指定されていないため、コンパイラによって結果が異なる。

そして、enum.のいくつかの問題については、enum.がうまく解決してくれます。

enumクラスの特徴。

  1. シェイプシフターで型変換が発生しない。
  2. スコープの問題で、ドメイン演算子でアクセスする必要がある。
  3. デフォルトの基礎となるデータ型は int です。

例として

#include 

using namespace std;

enum class color{
	red,
	yellow,
	blue
};

void fun_int(int x)
{
	cout<<"fun int: "<<<x<<endl;
}

int main()
{
	color c(static_cast<color>(1));

	//error
    //fun_int(c);
	
	fun_int(static_cast<int>(c));
	fun_int(static_cast<int>(color::red));
	//error
	//fun_int(static_cast
(red));

	
	return 0;
}


その結果は.

fun int: 1
fun int: 0


enum class color:int と宣言すると、エラーになります。

192:~ lurongming$ g++ main.cc
main.cc:26:6: warning: scoped enumerations are a C++11 extension [-Wc++11-extensions]
enum class color:int{
     ^
main.cc:26:12: error: ISO C++ forbids forward references to 'enum' types
enum class color:int{
           ^
main.cc:26:17: error: expected unqualified-id
enum class color:int{
                ^
main.cc:45:27: warning: use of enumeration in a nested name specifier is a C++11 extension [-Wc++11-extensions]
        fun_int(static_cast<int>(color::red));
                                 ^
main.cc:45:27: error: incomplete type 'color' named in nested name specifier
        fun_int(static_cast<int>(color::red));
                                 ^~~~~~~
2 warnings and 3 errors generated.


ISO C++ではenum型への前方参照を禁止しています。



enum は指定された型を禁止しています。