【问题标题】:static_cast on integer to enum conversionstatic_cast 整数到枚举的转换
【发布时间】:2014-07-07 12:19:25
【问题描述】:

有一些函数将枚举作为参数

void myfunc(myEnum input);

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

根据MSDN

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

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

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

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

【问题讨论】:

  • 强制转换的原因是因为语言需要它 - 与 C 不同,没有从整数到枚举类型的隐式转换。或者你是在问为什么语言是这样设计的?
  • @Mike Seymour 是的,我想知道他们为什么没有设置检查机制? enum 到 int 是隐式可转换的,所以如果没有检查并且责任在我身上,请以相同的方式使 int 到 enum。
  • 自动运行时检查是 C++ 通常避免的,让程序员可以选择是否为它们付费。要求显式转换会迫使您考虑是否需要进行检查,并让未来的读者清楚地知道正在发生一些不寻常的事情。允许隐式转换会默默隐藏潜在的错误。

标签: c++ casting enums static-cast


【解决方案1】:

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

通过添加演员表,您基本上可以告诉编译器'闭嘴,我知道我在做什么'。您在这里传达的是您确定您传入的值是“在枚举值的范围内”。而且您最好确保是这种情况,否则您将单程前往未定义的行为领域。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多