reinterpret_cast

6
在《C++ Without Fear: A Beginner's Guide That Makes You Feel Smart》一书中,第8章提到了有关reinterpret_cast的以下内容:

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

请问您希望对这段话进行描述?特别是该操作命名方式的原因?

谢谢。

3
这是一本很棒的书名! - Joe
今天又有一个问题出自这本书,但最终结果并没有让提问者感到聪明。 - Lightness Races in Orbit
啊,哈,原来是你。https://dev59.com/_VPTa4cB1Zd3GeqPkY9h 真可惜你不采纳我的建议去得到一个真正的程序员身份。 - Lightness Races in Orbit
1
@Joe:这是我从未听说过的名字。也许我太保守了,但如果它没有在《C++书籍指南》上推荐,我就持怀疑态度。C++是一个非常复杂的东西,足够复杂,以至于有数百本书会把基本事实搞错。我不建议任何未经(经验丰富的)社区推荐的C++书籍。 - sbi
2个回答

9

基本上,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 来尝试此操作。结果会完全不同。


4
它不一定具有相同的比特模式。在标准中,对于reinterpret_cast,很少有保证。5.2.10/3说,“reinterpret_cast所执行的映射是实现定义的。[注意:它可能会产生与原始值不同的表示,也可能不会]。”此外,reinterpret_cast无法将int强制转换为float(它可以将int *强制转换为float *)。任何执行该转换的实现都违反了标准(5.2.10/1,最后一句话),尽管它可能是一个足够常见的扩展。 - David Thornley

4
这里没有什么花哨的东西,它真的只是旨在重新解释一些内容。
从标准5.3.10中,reinterpret_cast旨在满足以下情况: - 指针可以显式转换为足以容纳它的任何整数类型。 - 整数类型或枚举类型的值可以显式转换为指针。 - 函数指针可以显式转换为不同类型的函数指针。 - 对象指针可以显式转换为不同对象类型的指针。 - 将函数指针转换为对象类型的指针或反之亦然是有条件支持的。 - 空指针值(4.10)被转换为目标类型的空指针值。 - 如果T1和T2都是函数类型或对象类型,则可以将“X的成员指针T1”类型的prvalue显式转换为不同类型“Y的成员指针T2”的prvalue。 - 如果可以使用reinterpret_cast将类型“指向T1的指针”显式转换为类型“指向T2的指针”,则可以将类型为T1的lvalue表达式强制转换为类型“对T2的引用”。也就是说,引用强制转换reinterpret_cast< T& >(x)与内置的&和*运算符具有相同的效果(对于reinterpret_cast< T&& >(x)也是如此)。

你犯了一个错误 - 标准中是第5.2.10段(你写成了5.3.10)。 - Kirill Lykov
数字不会在修订版之间改变,顺便问一下 :) - Kos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接