C++中的enum class

enum的对比

C++11之所以要引入enum class,是因为传统的enum

  • 作用域不限范围,会造成命名空间的污染
    1
    2
    3
    enum Color{black,white,red};	//black、white、red作用域和color作用域相同

    auto white = false; //错误,white已经被声明过了
    enum class的枚举成员默认具有强作用域,需要通过枚举类型名来访问,能够降低命名空间的污染
    1
    2
    3
    4
    5
    6
    7
    8
    9
    enum class Color{black,white,red}; //black、white、red作用域仅在大括号内生效

    auto white = false; //正确,这个white并不是Color中的white

    Color c = white; //错误,在作用域范围内没有white这个枚举量

    Color c = Color::white; //正确

    auto c = Color::white; //正确
  • 会发生隐式类型转换
    1
    2
    3
    4
    5
    6
    7
    8
    9
    enum Color{black,white,red};
    std::vector<std::size_t> primeFactors(std::size_t x); //函数返回x的质因数

    Color c = red;

    if(c < 14.5) //将color型别和double型别比较,发生隐式转换
    {
    auto factors = primeFactors(c); //计算一个color型别的质因数,发生隐式转换
    }
    enum class的元素只能通过static_cast进行强制类型转换
  • 不能进行前置声明,而enum class可以
    1
    2
    enum Color;			//错误
    enum class Color; //正确

参考


C++中的enum class
https://guts.homes/2025/06/08/cpp-enum-class/
作者
guts
发布于
2025年6月8日
许可协议