列挙子の強化

末尾のカンマの許可(C++11)

C ++ 11 から、 列挙 型 の 定義 の 際 に 書き 並べる 列挙 子 の 終わり に、 余分 な カンマ(,) を 置く こと が 許さ れる よう になり まし た。

enum Color { 
Black,
White,
Red,
Green,
Blue, // 最後にカンマを置いても良
};

Scoped Enum (C++11)

C ++ 11 で、 従来 の 列挙 型 の ほか に、 Scoped Enum (スコープ 付き の 列挙 型) が 追加 さ れ まし た。

enum class BloodType {
 	A,
  AB,
  B, 
  O,
}; 
enum class Rank {
	A, // BloodType:: A とは 区別 さ れる ので OK
	B, // BloodType:: B とは 区別 さ れる ので OK
	C,
	D, 
};

int main() {
 Rank rank = Rank:: D; // OK
}

Scoped Enum の 列挙 子 を 使用 する 際 には、 必ず 列挙 型 の 名前 による 修飾 が 必要 になり ます。 先 ほどの 例 で 言え ば、 列挙 子 A を「 A」 の よう に 使う こと は でき ず、 常に「BloodType:: A」 のよう に 指定 し ます。 この よう に、 列挙 子 が 列挙 型 の スコープ に 入る こと で、 列挙 子 の 名前 が、 他 の 何 かの 名前 と 衝突 する こと を 防ぎ ます。

基盤型の指定 (C++11)

C ++ 11 以降 では、 基盤 型 として 使う 整数型 を 指定 できる よう になり まし た。 基盤 型 を 指定 する には、 列挙 型 を 定義 する 際 に、 列挙 型 名 の 後ろ に「: 基盤 型 の 名前」 の よう に 記述 し ます。

#include < iostream >

enum class Color : char { // 基盤 型 は char 
	Black, 
	White,
	Red, 
	Green, 
	Blue, 
}; 
enum Color2 : char { // 基盤 型 は char 
	Black, 
	White, 
	Red, 
	Green, 
	Blue, 
};

int main() { 
	std::cout << sizeof( Color) << std::endl; 
	std::cout << sizeof( Color2) << std::endl;
}

列挙型の宣言 (C++11)

C ++ 11 からは、 列挙 型 の 宣言 だけを 行う こと が できる よう になり まし た。 列挙 型 の 宣言 は、 定義 を 行う 構文 から、 列挙 子 を 記述 する 部分 を 省略 し た 形 で 行い ます。 基盤 型 を 指定 する 場合 は、 宣言 と 定義 の 両方 で 同じ 型 を 指定 する よう に し なけれ ば なり ませ ん。

// 以下 は 宣言 
enum class E1; 
enum class E2 : char; 
enum E3; // エラー。 Unscoped Enumでは基盤型の指定が必要 
enum E4 : char; 

int main() {} // 以下は定義 

enum class E1 { A }; 
enum class E2 : char { B }; // 基盤型は宣言と揃えること 
enum E3 { C }; 
enum E4 : char { D }; // 基盤型は宣言と揃えること

コメント

タイトルとURLをコピーしました