将 void* param 转换为各种类型是 UB 吗?

Cur*_*ner 0 c++

void WorkHorse(void* ptr, int tag) {
   if (SomeFunction(tag)) {
       Foo* foo_ptr = (Foo*)ptr;
       // do stuff
   } else {
       Bar* bar_ptr = (Bar*)ptr;
   }
}
Run Code Online (Sandbox Code Playgroud)

我知道这通常是一个糟糕的设计,但很好奇它是否在技术上是 UB。

eer*_*ika 6

将 void* param 转换为各种类型是 UB 吗?

不,转换void*为指向对象类型的指针不是 UB。如果是的话,那void*基本上就没什么用了。

但是,在某些情况下,通过转换后的指针进行间接访问可能是 UB;通常当地址不包含适当类型的对象时。

正如您所指出的,void*像这样使用通常是糟糕的设计,并且仅在与某些 C API 交互时才需要。