枚举转换

static_cast 可以从整数或浮点类型转换为枚举类型(无论是作用域还是未作用域),*反之亦然。*它还可以在枚举类型之间进行转换。

  • 从无范围枚举类型到算术类型的转换是隐式转换; 使用 static_cast 是可能的,但不是必需的。

Version >= C++ 11

  • 将范围枚举类型转换为算术类型时:

    • 如果枚举的值可以在目标类型中准确表示,则结果就是该值。
    • 否则,如果目标类型是整数类型,则结果未指定。
    • 否则,如果目标类型是浮点类型,则结果与转换为基础类型然后转换为浮点类型的结果相同。

    例:

    enum class Format {
        TEXT = 0,
        PDF = 1000,
        OTHER = 2000,
    };
    Format f = Format::PDF;
    int a = f;                         // error
    int b = static_cast<int>(f);       // ok; b is 1000
    char c = static_cast<char>(f);     // unspecified, if 1000 doesn't fit into char
    double d = static_cast<double>(f); // d is 1000.0... probably
    
  • 将整数或枚举类型转换为枚举类型时:

    • 如果原始值在目标枚举范围内,则结果为该值。请注意,此值可能与所有枚举数不相等。
    • 否则,结果未指定(<= C++ 14)或未定义(> = C++ 17)。

    例:

    enum Scale {
        SINGLE = 1,
        DOUBLE = 2,
        QUAD = 4
    };
    Scale s1 = 1;                     // error
    Scale s2 = static_cast<Scale>(2); // s2 is DOUBLE
    Scale s3 = static_cast<Scale>(3); // s3 has value 3, and is not equal to any enumerator
    Scale s9 = static_cast<Scale>(9); // unspecified value in C++14; UB in C++17
    

Version >= C++ 11

  • 当浮点类型转换为枚举类型时,结果与转换为枚举的基础类型然后转换为枚举类型相同。

    enum Direction {
        UP = 0,
        LEFT = 1,
        DOWN = 2,
        RIGHT = 3,
    };
    Direction d = static_cast<Direction>(3.14); // d is RIGHT