【发布时间】:2016-06-10 15:31:25
【问题描述】:
C++11 范围枚举很棒,您应该尽可能使用它们。
但是,有时您需要将整数转换为作用域枚举值(例如,如果您从用户输入中获取它)。
是否有一种安全的方法来执行此操作并检测值何时无效(即超出枚举的允许值)?
如果整数无效,我相信仅使用 static_cast 会导致未定义的行为。是否有一种通用方法不需要手动为每个作用域枚举类型编写转换函数(并且每次向枚举添加新值时都需要更新)?
【问题讨论】:
-
行为未定义。第 7.2 节第 10 节说“算术或枚举类型的表达式可以显式转换为枚举类型。如果它在枚举类型的枚举值范围内,则该值不变;否则生成的枚举值为未指定。”所以值是未指定的,但行为不是未定义的(没有鼻恶魔)。
-
@Cornstalks,感谢您指出。这绝对比未定义要好。尽管如此,问题仍然存在:是否有一种很好的方法来检测该值是否无效?
-
不幸的是,我不知道有一个。
-
@Cornstalks 但是,在 C++17 中,行为将是未定义的:eel.is/c++draft/expr.static.cast#10
-
@ecatmur:请注意,“枚举值”比您列出的要多。特别是,对于范围枚举,该值可以是任何适合
int的值。 (请参阅 T.C. 的回答;直到阅读它,我自己才知道这一点......)