switch 语句中从 int 到枚举类的隐式转换
Implicit conversion from int to enum class in switch statement
enum class pid
{
Alpha, Beta, Gamma
};
int main()
{
int propId = 2;
switch(propId)
{
case pid::Alpha:
case pid::Beta:
case pid::Gamma:
break;
}
}
上面的代码片段在 msvc2012 中编译良好(并且有效),但在 clang-3.4 和 g++-4.8 中失败。这些需要在 switch 子句中使用static_cast<pid>(propId)
。
顺便说一下,没有显式强制转换的简单赋值(如 pid a = propId;
)会在每个编译器中产生错误。
哪一个做对了?
标准条款 4"标准转换"仅列出每个未作用域的枚举。因此,强枚举没有任何标准转换,您必须在任一方向上使用static_cast
。
你可以争辩说,这种显式性是强枚举的全部意义所在。它们不会在帽子掉落时充当整数,而是需要明确的意图声明。注意[谢谢,@DyP]switch
语句明确支持强枚举,不需要手动转换为某种整数类型。
相关文章:
- 错误:从"int"到枚举c++的转换无效
- 将作用域枚举转换为基础类型
- 枚举类的 C 样式强制转换到基础类型 char 的引用
- 用于 boost::p roperty_tree 的通用枚举转换器
- 在编译时将强类型枚举器转换为其基础类型?
- 将整数值转换为以枚举为基础的字符串
- 如何在没有映射的情况下在枚举和字符串之间进行转换?
- C++枚举类 std::size_t 隐式转换
- 安全地将枚举类从基础类型转换
- SWIG-将C++枚举转换为Python枚举
- 如果 int 是"not within the enums range",为什么将 int 转换为强类型枚举会编译?
- 如何编写模板以转换为基于整数/枚举的模板化类型
- 将指向类型化/大小的枚举的指针转换为指向基础类型的指针是否安全?
- C++枚举类:强制转换为不存在的条目
- 如何将C++代码中的枚举转换为 C
- 为什么这个枚举不转换为 int?
- 失败的证明转换字符串到枚举类
- 枚举类的重载强制转换运算符
- 返回强制转换枚举值C++的函数
- 转换枚举中整数的安全方法