【问题标题】:C++ int to enum class UBC++ int 到枚举类 UB
【发布时间】: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 的基础类型的值都可以的答案?

【问题讨论】:

标签: c++ c++11 undefined-behavior


【解决方案1】:

有趣的是,提供的示例中的 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);

}

【讨论】:

  • @MooingDuck 好点,将用 int32_t 重写我的示例。
  • 我已经对你的答案投了赞成票,但值得明确指出 intint32_t 可能是不同的类型。
  • @MooingDuck 实际上在这个例子中都可以,因为它不会变窄。
  • reinterpret_cast&lt;int*&gt;(&amp;d) 会遇到这个问题,但你的代码没有这个问题是对的
  • hmm,不幸的是库函数需要一个int32_t* 参数,因为它不仅返回void,还返回一些bool
猜你喜欢
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多