微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ int 枚举类 UB

如何解决C++ int 枚举类 UB

我有一个 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 的基础类型的任何值的答案?

解决方法

有趣的是,提供的示例中的 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 举报,一经查实,本站将立刻删除。