整数到枚举类型的转换中使用static_cast

3
有一个函数需要枚举作为参数。
void myfunc(myEnum input);

据我所知,如果我必须向这个函数传递一个整数,建议将其明确转换为枚举类型,原因是并非所有整数都是有效的枚举值。
根据MSDN">MSDN
“static_cast运算符可以将整数值显式转换为枚举类型。如果整数类型的值不在枚举值范围内,则结果枚举值未定义。”
根据C++标准5.2.9静态转换->10
"整数或枚举类型的值可以被显式转换为枚举类型。如果原始值在枚举值范围内(7.2),则该值不变。否则,结果值是未指定的(可能不在该范围内)。"
那么,在这种情况下使用static_cast有什么意义呢?是否有某些选项可以在枚举范围之外的值上引发异常(除了编写明确的代码)?

3
使用强制类型转换的原因是因为语言需要,与C语言不同,枚举类型不能从整数隐式转换而来。或者您是在问为什么设计语言要这样做? - Mike Seymour
@Mike Seymour 是的,我在想为什么他们没有加入检查机制?枚举类型可以隐式转换为整型,所以如果没有检查,责任就在我身上了,让整型到枚举类型的转换也一样吧。 - ontherocks
1
自动运行时检查是C++通常避免的,这给程序员选择是否为它们付费。要求显式转换会迫使您考虑是否需要进行检查,并向未来的读者清楚地表明一些不太寻常的事情正在发生。允许隐式转换将悄悄隐藏潜在的错误。 - Mike Seymour
1个回答

8
通常情况下,编译器只是想防止你自己给自己惹麻烦。这就是为什么你不能直接将 int 传递给需要枚举类型的函数。如果这样做,编译器会出现错误提示,因为 int 可能不匹配任何有效的 enum 值。
通过添加转换,你基本上告诉编译器:“闭嘴,我知道自己在干什么”。这里传达的意思是,你确定所传递的值“在枚举值范围内”。你最好确保这是正确的,否则就会进入未定义行为的领域。
如果这样很危险,那么为什么编译器不为整数值添加运行时检查呢?原因是,像往常一样,涉及到C++的性能问题。也许你从周围的程序逻辑中“知道”,这个整数值始终有效,并且你不能浪费任何时间进行愚蠢的运行时检查。从语言设计的角度来看,这可能不是最合理的默认选择,特别是当你的目标是编写健壮的代码时。但这就是C++的工作方式:开发人员永远不应该为可能不想使用的功能付费。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接