C++中有两种枚举,

  1. 普通枚举(enum,unscoped enum)
  2. 枚举类(enum class, scoped enum)

通常,花括号里面的名字具有scope的作用域及可见性,但对普通枚举并非如此。普通枚举中定义的枚举常量,在花括号外也可见。而枚举类则需要加上类名+域作用符来获取花括号内的名字。

enum Color { RED = 1, GREEN, BLUE, };  
enum class CMYK { C = -1, M = 0, Y = 2, K, };  
enum NewColor: uint8_t { NR = 0, NG, NB };  
  
void foo()  
{  
    Color c = RED;  
    CMYK cmyk = CMYK::C;  // Note: scope is need here  
    NewColor nc = NB;  
    cout << sizeof c << endl;  // 4  
    cout << sizeof(cmyk) << endl;  // 4  
    cout << sizeof(NewColor) << endl;  // 1  
}

此外,enum class不允许隐式转换为整数,意味着你需要显式转换,也就是说enum class具有更强的类型。