3 回答
TA贡献1793条经验 获得超6个赞
使用static_cast
:它是最精确的演员,它准确地描述了在这里进行的转换。
有一种误解,认为使用reinterpret_cast
是一种更好的匹配,因为它意味着“完全忽略类型安全,只是从A转换为B”。
但是,这实际上并没有描述a的效果reinterpret_cast
。相反,reinterpret_cast
它具有许多含义,因为所有这些含义都表明“由reinterpret_cast
执行定义执行的映射。”[5.2.10.3]
但是在特定情况下,从映射void*
到T*
映射完全由标准定义; 即,在不改变其地址的情况下为无类型指针分配类型。
这是一个偏好的理由static_cast
。
此外,并且可以说更重要的是,每次使用reinterpret_cast
都是彻头彻尾的危险,因为它将任何东西转换为其他任何东西(指针),同时static_cast
限制性更强,从而提供更好的保护。这已经让我免于我偶然试图将一个指针类型强制转换为另一个指针类型的错误。
TA贡献1806条经验 获得超8个赞
这是一个棘手的问题。一方面,Konrad对reinterpret_cast的规范定义提出了一个很好的观点,尽管在实践中它可能做同样的事情。另一方面,如果你在指针类型之间进行转换(例如,当通过char *在内存中索引时相当常见),static_cast将生成编译器错误,并且无论如何你将被迫使用reinterpret_cast。
在实践中我使用reinterpret_cast,因为它更能描述强制转换操作的意图。您当然可以为不同的运算符设置一个仅指定指针重新解释的情况(保证返回相同的地址),但标准中没有一个。
TA贡献1786条经验 获得超12个赞
我建议总是使用最弱的演员。
reinterpret_cast
可用于将指针强制转换为float
。演员阵容的结构越多,使用它就越需要关注。
在这种情况下char*
,我会使用c风格的演员,直到我们有一些reinterpret_pointer_cast
,因为它更弱,没有别的就足够了。
- 3 回答
- 0 关注
- 602 浏览
添加回答
举报