猿问

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

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

static_cast和reinterpret_cast似乎都可以很好地将void *转换为另一个指针类型。是否有充分理由支持其他人?



神不在的星期二
浏览 603回答 3
3回答

摇曳的蔷薇

使用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限制性更强,从而提供更好的保护。这已经让我免于我偶然试图将一个指针类型强制转换为另一个指针类型的错误。

慕森卡

这是一个棘手的问题。一方面,Konrad对reinterpret_cast的规范定义提出了一个很好的观点,尽管在实践中它可能做同样的事情。另一方面,如果你在指针类型之间进行转换(例如,当通过char *在内存中索引时相当常见),static_cast将生成编译器错误,并且无论如何你将被迫使用reinterpret_cast。在实践中我使用reinterpret_cast,因为它更能描述强制转换操作的意图。您当然可以为不同的运算符设置一个仅指定指针重新解释的情况(保证返回相同的地址),但标准中没有一个。

开满天机

我建议总是使用最弱的演员。reinterpret_cast可用于将指针强制转换为float。演员阵容的结构越多,使用它就越需要关注。在这种情况下char*,我会使用c风格的演员,直到我们有一些reinterpret_pointer_cast,因为它更弱,没有别的就足够了。
随时随地看视频慕课网APP
我要回答