【发布时间】:2021-07-20 19:42:00
【问题描述】:
我有一个enum,看起来像这样:
enum class MY_TYPE : int32_t{
UNKNOWN = 0,
A = 101,
B = 102,
C = 103,
D = 104,
E = 105
};
我想从中转换给定的值。
首先,是否保证下面的代码不会引发未定义的行为?
int32_t library_func(int* tp){ *tp = 275; return 0;}
int main(){
MY_TYPE d = static_cast<MY_TYPE>(224);
library_func(reinterpret_cast<int*>(&d));
std::cout << "d is " << static_cast<int>(d);
}
如果我转换的值不在MY_TYPE 的值范围内,它是 UB 吗?关于这个,我发现了以下问题:What happens if you static_cast invalid value to enum class?
这会按预期打印275。我是否正确理解了转换任何适合enum 的基础类型的值都可以的答案?
【问题讨论】:
-
在大多数情况下,
reinterpret_cast是您拥有 UB 的明确信号。在这种情况下,该信号是正确的。MY_TYPE不是int,所以你不能把它当作一个。 -
@NathanOliver 如果它是一个int,那会很好吗?
-
@Curunir 是的,绝对。如果它是一个 int,您可以将它作为指向 int 的指针传递,并且您不必进行任何强制转换。
标签: c++ c++11 undefined-behavior