我应该使用静态的
static_cast和reinterpret_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
则更加严格,从而提供更好的保护。 这已经将我从错误中拯救出来,我不小心试图将一个指针类型强制为另一个指针类型。
这是一个棘手的问题。 一方面,Konrad对reinterpret_cast的规格定义提出了一个很好的观点,尽管在实践中它可能会做同样的事情。 另一方面,如果要在指针类型之间进行转换(例如,在通过char *在内存中进行索引时非常常见), static_cast将生成编译器错误,无论如何您将被迫使用reinterpret_cast 。
在实践中,我使用reinterpret_cast,因为它更多地描述了投射操作的意图。 你当然可以为不同的操作员指定指针重新解释(保证返回相同的地址),但标准中没有一个。
我建议始终使用最弱的演员阵容。
reinterpret_cast可以用来将一个指针转换为一个浮点数。 越是破坏性的演员阵容,使用它的需求越多。
在char *的情况下,我会使用c风格的演员,直到我们有一些reinterpret_pointer_cast,因为它更弱,没有其他东西是足够的。
链接地址: http://www.djcxy.com/p/73755.html上一篇: Should I use static