C++型铸造.static_cast什么时候会成功,reinterpret_cast会导致问题?

C++ type casting. When will static_cast succeed and reinterpret_cast will cause an issue?

本文关键字:cast reinterpret 问题 什么时候 static C++ 成功      更新时间:2023-10-16

我知道static_cast是从一种类型到另一种类型的转换,(直观地(是一种在某些情况下可以成功并且在没有危险转换的情况下有意义的转换。同时,reinterpret_cast是表示不安全转换的强制转换,可能会将一个值的位重新解释为另一个值的位。

有人可以描述代码编译、强制转换和static_cast不会导致问题的场景,但有了reinterpret_cast就会有问题吗?

这将做到这一点:

#include <iostream>
using namespace std;
struct C{int n;};
struct A{int n;};
struct B : A, C{};
int main()
{
    B b;
    B* pb = &b;
    cout << static_cast<C*>(pb) << "n";
    cout << reinterpret_cast<C*>(pb);
}

请注意两个地址的差异。

我在这里构建了一些多重继承,并在基类中放置了一个显式成员,以规避空基类可能优化为零的大小。

请参阅 https://ideone.com/QLvBku

最简单的情况是 reinterpret_cast<void*>(NULL) ,它可能产生一个非空指针。

相比之下,static_cast<void*>(NULL) 是安全的,因为它需要生成空指针。

为什么? NULL 是一个等于 0 的整数常量。 static_cast 要求将 0 转换为适当的 null 指针,但reinterpret_cast没有相同的要求。如果空指针的内部表示形式与整数零的内部表示形式不同,则结果将不同。这种类型的破坏最有可能发生在具有分段寻址的体系结构上。

其中一种情况是多重继承 - static_cast调整地址(因此强制转换后基对象指针的地址可以不同于派生对象地址,以指向正确的基类项(。

reinterpret_cast 不执行任何地址调整,因此强制转换为基类可能会使用错误的地址(即始终返回派生对象的地址不变(。