我想将 void* 转换为 char* reinterpret_cast 和 static_cast,哪个适合?static_cast<char*> or reinterpret_cast<char*>
5 回答
这主要是风格问题。 static_cast
可以进行任何与隐式转换相反的转换(并且不会删除const
or volatile
)。由于char*
tovoid*
是隐含的,
static_cast
因此似乎已指示;通常的规则是
尽可能static_cast
优先使用。reinterpret_cast
鉴于这种使用特别危险,一些编码指南可能更喜欢reinterpret_cast
,以表明这一事实。
static_cast
(与 一起dynamic_cast
)用于在同一类层次结构中的对象之间进行转换,而reinterpret_cast
在不同类型之间进行完全转换。因此,在您的情况下,您应该选择reinterpret_cast
.
reinterpret_cast
指针类型之间是根据static_cast
through定义的void *
:
5.2.10 重新解释演员表 [expr.reinterpret.cast]
7 - [...] 当
v
“pointer toT1
”类型的纯右值转换为“pointer to cvT2
”类型时,结果是static_cast<cv T2*>(static_cast<cv void*>(v))
如果T1
和T2
都是标准布局类型,并且 的对齐要求T2
不比 的更严格T1
,或者如果任一类型是void
.
因此,如果您在标准布局对象指针类型(例如char *
)之间转换 via void *
,则static_cast
适合于转换为/从void *
.
reinterpret_cast
在这种情况下对你有用,但不要经常使用它,因为它是最危险的演员。基本上,您可以使用reinterpret_cast
完全不相关的指针,因此您有义务处理结果(即检查结果是否有效以供进一步使用)。
我想这取决于上下文: static_cast<> 应该在有隐式转换的情况下使用。reinterpret_cast<> 应该在两个指针都属于不同类型时使用
虽然不推荐 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* 等转换,这些转换本质上是不安全的。