列舉轉換

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