列舉轉換
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