C++ 11强类型枚举
引言
在C++11之前,传统的枚举类型(enum)存在一些明显的缺陷,比如枚举成员会被暴露到外层作用域、可能与其他枚举成员或变量名冲突、隐式转换为整数类型等问题。为了解决这些问题,C++11引入了强类型枚举(也称为限域枚举或作用域枚举),通过enum class
或enum struct
语法来声明。
传统枚举的问题
在了解强类型枚举之前,让我们先回顾一下传统枚举的缺点:
enum Color { RED, GREEN, BLUE };
enum TrafficLight { RED, YELLOW, GREEN }; // 错误:重定义 RED 和 GREEN
void func() {
int a = RED; // RED 直接暴露在外层作用域
if (a == RED) { // 哪个RED?Color::RED 还是 TrafficLight::RED?
// ...
}
}
注意
上面的代码无法通过编译,因为RED
和GREEN
在两个枚举中重复定义,会导致命名冲突。