【问题标题】:reinterpret_castreinterpret_cast
【发布时间】:2011-06-12 12:06:31
【问题描述】:

C++无所畏惧:让你感觉聪明的初学者指南一书中,在第(8)章中,提到了以下关于reinterpret_cast

....从一种指针类型 (int) 转换为另一种 (char*)。因为转换改变了数据指向的解释方式,所以它被称为 reinterpret_cast,而不是 static_cast。*

你能在这里描述一下这一段吗?尤其是操作命名方式的原因?

谢谢。

【问题讨论】:

标签: c++ casting reinterpret-cast


【解决方案1】:

基本上,reinterpret_cast 将特定位置的位模式重新解释为不同的类型。

请参见此处的示例:http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc05keyword_reinterpret_cast.htm

reinterpret_cast 运算符产生一个新类型的值,该值具有 与其参数相同的位模式。

static cast转换参数,而不是仅仅重新解释它。您可以通过将int 静态转换为float 并重新解释将int 转换为float 来尝试此操作。结果会完全不同。

【讨论】:

  • 不一定有相同的位模式。标准中对reinterpret_cast 的保证很少。 5.2.10/3 说“reinterpret_cast 执行的映射是实现定义的。[注意:它可能会或可能不会产生与原始值不同的表示。]”此外,reinterpret_cast 不能转换 @ 987654331@ 到 float(它可以将 int * 转换为 float *)。任何执行该转换的实现都违反了标准(5.2.10/1,最后一句),尽管它可能是一个足够常见的扩展。
【解决方案2】:

这里没有什么花哨的。它真的只是为了重新解释一些东西。

从标准 5.3.10 开始,reinterpret_cast 旨在满足以下情况:

  • 指针可以显式转换为任何大到足以容纳它的整数类型。
  • 整数类型或枚举类型的值可以显式转换为指针。
  • 指向函数的指针可以显式转换为指向不同类型函数的指针。
  • 指向对象的指针可以显式转换为指向不同对象类型的指针。
  • 有条件地支持将指向函数的指针转换为指向对象类型的指针,反之亦然。
  • 将空指针值 (4.10) 转换为目标类型的空指针值。
  • 如果 T1 和 T2 都是函数类型或都是对象类型,则“指向 T1 类型 X 成员的指针”类型的纯右值可以显式转换为不同类型“指向 T2 类型 Y 成员的指针”的纯右值.
  • 如果可以使用 reinterpret_cast 将“指向 T1 的指针”类型的表达式显式转换为“指向 T2 的指针”类型,则可以将类型 T1 的左值表达式强制转换为类型“对 T2 的引用”。也就是说,引用强制转换 reinterpret_cast (x) 与使用内置 & 和 * 运算符的转换 *reinterpret_cast(&x) 具有相同的效果(对于 reinterpret_cast(x) 也是如此) .

【讨论】:

  • 你犯了一个错误 - 这是标准中的第 5.2.10 段(你写了 5.3.10)
  • 不允许数字从一个版本到另一个版本,顺便说一句? :)
猜你喜欢
  • 2011-06-17
  • 2011-06-10
  • 2012-12-25
  • 2019-11-15
  • 2016-02-05
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多