有一些函数将enum作为参数
void myfunc(myEnum input);
据我所知,如果我必须给这个函数一个整数,建议将它显式地转换为枚举,原因是所有整数可能都不是有效的枚举值。
根据 MSDN
" static_cast运算符可以显式地将整数值转换为 枚举类型。如果积分类型的值不下降 在枚举值范围内,产生的枚举 值未定义。"
并根据C ++标准 5.2.9静态强制转换 - > 10
"可以显式转换积分或枚举类型的值 到枚举类型。如果原始值,该值不变 在枚举值(7.2)的范围内。否则, 结果值未指定(可能不在该范围内)。"
那么在这种情况下使用static_cast
的重点是什么?是否有一些选项可以在枚举范围之外的值上引发异常(除了为其编写显式代码)?
答案 0 :(得分:4)
像往常一样,编译器只是试图阻止你在脚下射击。这就是为什么你不能只将int
传递给期望枚举的函数。编译器会正确地抱怨,因为int
可能与任何有效的enum
值都不匹配。
通过添加演员你基本上告诉编译器'闭嘴,我知道我在做什么'。你在这里传达的是你确定你传入的值是'在枚举值的范围内'。而且你最好确保是这种情况,或者你是单向前往undefined-behavior-land。
如果这很危险,那么编译器为什么不为整数值添加运行时检查?原因是,与C ++一样,性能也是如此。也许你只是从周围的程序逻辑知道,int值总是有效的,你绝对不能浪费任何时间进行愚蠢的运行时检查。从语言设计的角度来看,这可能不是最合理的默认选择,特别是当您的目标是编写健壮的代码时。但这就是C ++的工作原理:开发人员永远不必为他们可能不想使用的功能付费。