如何解决C++ int 枚举类 UB
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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。