static_cast和reinterpret_cast似乎都可以很好地将void*转换为另一个指针类型.是否有充分理由支持其他人?
使用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,因为它更能描述强制转换操作的意图.您当然可以为不同的运算符设置一个仅指定指针重新解释的情况(保证返回相同的地址),但标准中没有一个.