哪个转换在C ++中是正确的?

时间:2012-09-04 09:36:46

标签: c++ type-conversion

我想将一个void *转换为char * reinterpret_cast和static_cast,哪一个适合?static_cast<char*> or reinterpret_cast<char*>

5 个答案:

答案 0 :(得分:5)

这主要是风格问题。 static_cast可以进行任何转化 这与隐式转换相反(而不是 删除constvolatile)。由于char*void*是隐含的, 似乎表明static_cast;通常的规则是使用 <{1}},static_cast,尽可能优先于reinterpret_cast

鉴于这种使用特别危险,一些编码指南 可能更喜欢reinterpret_cast,以表明这一事实。

答案 1 :(得分:3)

static_cast(与dynamic_cast一起)用于在同一类层次结构中的对象之间进行转换,而reinterpret_cast则用于在不同类型之间进行转换。所以在你的情况下你应该去reinterpret_cast

答案 2 :(得分:3)

指针类型之间的

reinterpret_cast是根据static_castvoid *定义的:

  

5.2.10重新解释cast [expr.reinterpret.cast]

     

7 - [...]当一个prvalue   类型为“v的指针”的T1将转换为“指向 cv T2的指针”,如果两者static_cast<cv T2*>(static_cast<cv void*>(v)),则结果为T1 {1}}和T2标准布局类型和对齐方式   T2的要求不比T1更严格,或者任何一种类型void

因此,如果您通过char *在标准布局对象指针类型(例如void *)之间进行转换,那么static_cast适合转换为void *

答案 3 :(得分:1)

在这种情况下,

reinterpret_cast适合你,但不要经常使用它,因为它是最危险的演员。基本上,您可以reinterpret_cast完全不相关的指针,因此您有义务处理结果(即检查结果是否对进一步使用有效)。

答案 4 :(得分:-1)

我想这取决于背景:     的static_cast&LT;&GT; 应该在有隐式转换的情况下使用。     的reinterpret_cast&LT;&GT; 当两个指针都是不同类型时应该使用

虽然不建议使用reinterpret_cast。

您不应该使用static_cast来转换继承层次结构,而是使用dynamic_cast。

http://msdn.microsoft.com/en-us/library/e0w9f63b(v=vs.80).aspx

reinterpret_cast运算符可用于转换,例如char *到int *,或One_class *到Unrelated_class *,这些转换本质上是不安全的。