我想将一个void *转换为char * reinterpret_cast和static_cast,哪一个适合?static_cast<char*> or reinterpret_cast<char*>
答案 0 :(得分:5)
这主要是风格问题。 static_cast
可以进行任何转化
这与隐式转换相反(而不是
删除const
或volatile
)。由于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_cast
到void *
定义的:
5.2.10重新解释cast [expr.reinterpret.cast]
7 - [...]当一个prvalue 类型为“
v
的指针”的T1
将转换为“指向 cvT2
的指针”,如果两者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 *,这些转换本质上是不安全的。