【问题标题】:Is it safe to cast arbitrary values of the underlying type to a strongly-typed enum type?将底层类型的任意值转换为强类型枚举类型是否安全?
【发布时间】:2011-08-07 17:02:46
【问题描述】:

如果我有一个强类型枚举,比如基础类型 int,是否可以将不匹配任何枚举数的 int 值强制转换为枚举类型?

enum e1 : int { x = 0, y = 1 };
enum class e2 : int { x = 0, y = 1 };

int main() {
        e1 foo = static_cast<e1>(42); // is this UB?
        e2 bar = static_cast<e2>(42);
}

【问题讨论】:

    标签: c++ enums c++11


    【解决方案1】:

    从 n3290,5.2.9 静态转换 [expr.static.cast]:

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

    枚举类型 包括那些用enum 声明的类型和那些用enum classenum struct 声明的类型,标准分别称为无作用域枚举和作用域枚举。在 7.2 枚举声明 [dcl.enum] 中有更详细的描述。

    枚举类型的不会与其枚举数混淆。在您的情况下,由于您声明的所有枚举都将int 作为其基础类型,因此它们的值范围与int 的值范围相同:从INT_MININT_MAX(包括)。

    由于42 具有int 类型并且显然是int 的值,因此定义了行为。

    【讨论】:

    • 啊,我误解了“枚举值”的意思。谢谢。
    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多