static_cast on integer to enum conversion

时间:2014-07-07 12:19:26

标签: c++ casting enums static-cast

有一些函数将enum作为参数

void myfunc(myEnum input);

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

根据 MSDN

  

" static_cast运算符可以显式地将整数值转换为   枚举类型。如果积分类型的值不下降   在枚举值范围内,产生的枚举   值未定义。"

并根据C ++标准 5.2.9静态强制转换 - > 10

  

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

那么在这种情况下使用static_cast的重点是什么?是否有一些选项可以在枚举范围之外的值上引发异常(除了为其编写显式代码)?

1 个答案:

答案 0 :(得分:4)

像往常一样,编译器只是试图阻止你在脚下射击。这就是为什么你不能只将int传递给期望枚举的函数。编译器会正确地抱怨,因为int可能与任何有效的enum值都不匹配。

通过添加演员你基本上告诉编译器'闭嘴,我知道我在做什么'。你在这里传达的是你确定你传入的值是'在枚举值的范围内'。而且你最好确保是这种情况,或者你是单向前往undefined-behavior-land。

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