问题描述
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
的基础类型的任何值的答案?
解决方法
有趣的是,提供的示例中的 UB 与指针别名严格相关,而不是将枚举分配给未命名的值。如果它不会被指针别名,则不会有使用枚举之外的值的 UB,即以下是 A-OK:
int32_t library_func(int32_t tp){ return tp * 10;}
int main(){
MY_TYPE d = static_cast<MY_TYPE>(224);
MY_TYPE v {library_func(static_cast<int32_t>(d))};
std::cout << "v is " << static_cast<int32_t>(v);
}