枚举转换
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