c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

标签 c++ pointers static-cast reinterpret-cast

static_castreinterpret_cast 似乎都可以很好地将 void* 转换为另一种指针类型。是否有充分的理由偏爱其中一个?

最佳答案

使用 static_cast:它是准确描述此处进行的转换的最窄类型。

有一种误解,认为使用 reinterpret_cast 会更好,因为这意味着“完全忽略类型安全,只是从 A 转换为 B”。

但是,这实际上并没有描述 reinterpret_cast 的效果。相反,reinterpret_cast 有多种含义,所有含义都认为“reinterpret_cast 执行的映射是实现定义的”。 [5.2.10.3]

但在从 void*T* 的特殊情况下,映射完全由标准定义;即,将类型分配给无类型指针而不更改其地址。

这是更喜欢 static_cast 的原因。

另外,并且可以说更重要的是,每次使用 reinterpret_cast 都是非常危险的,因为它会将任何东西真正转换为其他任何东西(对于指针),而 static_cast限制性更强,因此提供了更好的保护水平。这已经使我免于意外尝试将一种指针类型强制转换为另一种的错误。

关于c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5013596/

相关文章:

c++ - for 循环中的 static_cast

c - 指针周围存在大量内存泄漏

c - C 中字符串的差异

c++ - WTL如何在同一个窗口中使用2个自定义绘制的CListViewCtr

c++ - 在 MFC 中使用 Direct2D 将 svg 文件转换为位图

c - 直接返回地址时出现段错误,但通过指针返回地址时没有错误

c++ - 基于值(value)的向上转型

c++ - 不带尖括号的 static_cast 代码片段我不明白

c++ - 在 C++ 中一次读取一个文件

c++ - int 如何成为 AssetManager?