使用C++风格的静态转换(static_cast)或重新解释转换(reinterpret_cast),将Void*转换为TYPE*。

8
所以,如果你要从Void* 转换成 Type* 或者从Type* 转换成 Void*,应该使用哪个呢?
void func(void *p)
{
    Params *params = static_cast<Params*>(p);
}

或者

void func(void *p)
{
    Params *params = reinterpret_cast<Params*>(p);
}

对我而言,static_cast 似乎更加正确,但我也看到两者都用于同一目的。此外,转换的方向是否重要?即,对于以下情况,我是否仍应使用 static_cast:
_beginthread(func,0,static_cast<void*>(params)

我看了其他有关C++风格转换的问题,但我仍然不确定在这种情况下正确的方式是什么(我认为应该使用static_cast)

3个回答

9

您应该使用static_cast,以便正确地操作指针,使其指向正确的位置。但是,只有在第一次使用static cast将指针转换为void *时,才应执行此操作。否则,您应该重新解释为完全与原始指针相同类型(没有基类或类似内容)。


4

0

你应该始终避免使用 reinterpret_cast,在这种情况下使用 static_cast 就可以了。当转换为 void* 指针时,不需要进行任何类型的转换。


那么为什么需要reinterpret_cast<>?有哪些情况下应该使用reinterpret_cast<>?所有强制转换操作都可以由其他三个强制转换运算符覆盖吗? - Martin York
如果void*的另一端将转换为基类,则在分配给void之前,您需要先将其转换为该基类。 - Edward Strange
@Noah 有相关的参考资料吗? - anon
除了标准之外,您是指什么?允许的静态转换及其结果在5.2.9(expr.static.cast)中有描述。关于void*的段落分别在第4和第10段。 - Edward Strange
@MartinYork,reinterpret_cast 是用于在不同但大小相同的类型之间转换的(例如 intptr_t <-> void*),使用 static_cast 或类似的操作是行不通的。 - Logan Capaldo
@Logan Capaldo:谢谢。我只是想表达我对Neil的说法持不同意见。 - Martin York

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接