6

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

4

5 回答 5

5

这主要是风格问题。 static_cast可以进行任何与隐式转换相反的转换(并且不会删除constor volatile)。由于char*tovoid*是隐含的, static_cast因此似乎已指示;通常的规则是 尽可能static_cast优先使用。reinterpret_cast

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

于 2012-09-04T09:49:09.397 回答
3

static_cast(与 一起dynamic_cast)用于在同一类层次结构中的对象之间进行转换,而reinterpret_cast在不同类型之间进行完全转换。因此,在您的情况下,您应该选择reinterpret_cast.

于 2012-09-04T09:39:35.757 回答
3

reinterpret_cast指针类型之间是根据static_castthrough定义的void *

5.2.10 重新解释演员表 [expr.reinterpret.cast]

7 - [...] 当 v“pointer to T1”类型的纯右值转换为“pointer to cv T2 ”类型时,结果是static_cast<cv T2*>(static_cast<cv void*>(v))如果T1T2都是标准布局类型,并且 的对齐要求T2不比 的更严格T1,或者如果任一类型是void.

因此,如果您在标准布局对象指针类型(例如char *)之间转换 via void *,则static_cast适合于转换为/从void *.

于 2012-09-04T09:53:45.253 回答
1

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

于 2012-09-04T09:42:43.373 回答
-1

我想这取决于上下文: 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* 等转换,这些转换本质上是不安全的。

于 2012-09-04T09:47:41.757 回答