除了类之外,C++还提供了另一种简单形式的用户自定义类型,使得我们可以枚举一系列值:

    1. enum class Color{red,blue,green};
    2. enum class Traffic_light{green,yellow,red};
    3. Color col=Color::red;
    4. Traffic_light light=Traffic_light::red;

    其中枚举值(如red)位于其 enum class的作用域之内,因此我们可以在不同的enum class中重复使用这些枚举值而不致引起混淆。例如, Color::red是指 Color的red,它与Traffic light:red显然不同。
    枚举类型常用于描述规模较小的整数值集合。通过使用有指代意义的(且易于记忆的)枚举值名字可提高代码的可读性,降低出错的风险。
    enum后面的 class指明了枚举是强类型的,且它的枚举值位于指定的作用域中。不同的 enum class是不同的类型,这有助于防止对常量的意外误用。在上面的例子中,我们不能混用 Traffic light和 Color的值:

    1. Color x=red //错误:哪个red?
    2. Color y= Traffic_light::red; //错误:这个red不是Color的对象
    3. Color z= Color::red; //OK

    同样,我们也不能隐式地混用 Color和整数值:

    1. int i= Color::red; //错误:Color::red不是一个int
    2. Color c=2; //错误:2不是一个 Color对象

    如果你不想显式地限定枚举值名字,并且希望枚举值可以是int(无须显式转换),则应该去掉 enum class中的class而得到一个“普通的”enum(见8.4.2节)。
    默认情况下, enum class只定义了赋值、初始化和比较(即==和<,见2.2.2节)操作。然而,既然枚举类型是一种用户自定义类型,那么我们就可以为它定义别的运算符:

    1. Traffic_light& operator++(Traffic_light& t) //前置递增运算符++
    2. {
    3. switch(t)
    4. {
    5. case Traffic_light::green: return t=Traffic_light::yellow;
    6. case Traffic_light::yellow: return t=Traffic_light::red;
    7. case Traffic_light::red: return t=Traffic_light::green;
    8. }
    9. }
    10. Traffic_light next=++light; //next变成了Traffic_light::green

    C++也提供了次强类型的“普通的”enum(见8.4.2节)。