对整型到enum的转换进行Static_cast

static_cast on integer to enum conversion

本文关键字:Static cast 换进 转换 整型 enum      更新时间:2023-10-16

某个函数接受enum作为实参

void myfunc(myEnum input);

据我所知,如果我必须给这个函数一个整数,建议将其显式转换为enum,原因是所有整数可能都不是有效的enum值。

根据MSDN

" static_cast操作符可以显式地将整型值转换为枚举类型。如果整型的值不下降在枚举值范围内,生成的枚举值未定义。"

和c++标准5.2.9静态强制转换-> 10

"整型或枚举类型的值可以显式转换到枚举类型。如果为原值,则该值不变在枚举值(7.2)的范围内。否则,结果值未指定(并且可能不在该范围内)。"

那么在这种情况下使用static_cast有什么意义呢?是否有一些选项会在枚举范围之外的值上引发异常(而不是为此编写显式代码)?

像往常一样,编译器只是试图阻止您搬起石头砸自己的脚。这就是为什么不能将int传递给需要枚举的函数。编译器将正确地抱怨,因为int可能不匹配任何有效的enum值。

通过添加强制转换,你基本上告诉编译器'闭嘴,我知道我在做什么'。你在这里传达的是你确定你传递的值是"在枚举值的范围内"。你最好确保这是事实,否则你将踏上一条通往未定义行为的单程之旅。

如果这是如此危险,那么为什么编译器不为整数值添加一个运行时检查?原因就像c++一样,是性能问题。也许你只是从周围的程序逻辑中知道 int值总是有效的,你绝对不能把任何时间浪费在愚蠢的运行时检查上。从语言设计的角度来看,这可能不是最合理的默认选择,特别是当您的目标是编写健壮的代码时。但这就是c++的工作原理:开发人员永远不应该为他们可能不想使用的功能付费。