C++ 是否将void*param强制转换为各种类型?

C++ 是否将void*param强制转换为各种类型?,c++,C++,我知道这通常是一个糟糕的设计,但奇怪的是,如果它是技术上的UB 是否将void*param强制转换为各种类型 否,将void*强制转换为指向对象类型的指针是不正确的。如果是这样,那么void*基本上是无用的 然而,在某些情况下,通过转换的指针进行间接定向可能是错误的;通常当地址不包含适当类型的对象时 正如您所指出的,像这样使用void*通常是不好的设计,并且只有在与一些C API交互时才需要使用它。您的代码中我最担心的部分是转换的样式,而不是转换的方式。我更喜欢使用static_cast而不是C

我知道这通常是一个糟糕的设计,但奇怪的是,如果它是技术上的UB

是否将void*param强制转换为各种类型

否,将
void*
强制转换为指向对象类型的指针是不正确的。如果是这样,那么
void*
基本上是无用的

然而,在某些情况下,通过转换的指针进行间接定向可能是错误的;通常当地址不包含适当类型的对象时


正如您所指出的,像这样使用
void*
通常是不好的设计,并且只有在与一些C API交互时才需要使用它。

您的代码中我最担心的部分是转换的样式,而不是转换的方式。我更喜欢使用
static_cast
而不是C-style cast。使用适合于预期工作的最弱工具可以为编译器指出有问题的代码提供最大的回旋余地(也称为关于可能的bug的警告)

使用
static\u cast
的一个附带好处是,您的问题的答案直接位于@cppreference.com上。检查第10点,该点以以下内容结束

将任何指针转换为指向void的指针,再转换回指向原始(或更多cv限定)类型的指针,将保留其原始值

如果您已将
Foo*
强制转换为
void*
以获取作为
ptr
传入的值,则
静态\u强制转换回到
Foo*
将恢复原始值。只要原始值没有变成悬空指针,就可以取消引用它

公平地说,在这种情况下,使用C样式转换或
静态\u转换
都会得到相同的结果。您可以从显式cast页面@cppreference.com获取文档,因为该页面链接到静态_cast页面



另外,除非API要求,否则不要进行这些转换。似乎在这一点上达成了一致,所以对我来说这只是一个脚注。

定义的是转换发生了。这是一个有效的演员阵容吗?这就是问题所在,没错。我想问题应该是“这个代码UB,假设
标记
正确地标识了要转换到的类型吗?”假设
标记
正确地标识了应该转换到的类型
void*
,这很好,是吗?@CuriousLearner是的,应该很好。
void*
对于对象指针来说是可以的,不是函数指针。@chux:函数指针有条件地支持它。也就是说,一个实现可能会选择支持它。@Nicolas我在C标准中找不到对有条件支持的
void*
和函数指针的转换6.3.2.3指针的支持。没有这一点,这将是乌布。也许你知道C++中的一些东西?
void WorkHorse(void* ptr, int tag) {
   if (SomeFunction(tag)) {
       Foo* foo_ptr = (Foo*)ptr;
       // do stuff
   } else {
       Bar* bar_ptr = (Bar*)ptr;
   }
}