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);

}