将指针转换为指针时的 static_cast VS reinterpret_cast

时间:2021-06-25 21:35:56

标签: c++ reinterpret-cast static-cast

鉴于以下条件:

struct A
{
    int a;
};

struct B
{
    int b;
};

int main()
{
    A  a {1};
    A* p = &a;

使用 static_cast 和通过 reinterpret_cast 使用 void* 进行投射会产生相同的结果吗?即以下表达式之间有什么区别吗?

    static_cast      <A*> ( static_cast      <void*> (p) );
    reinterpret_cast <A*> ( reinterpret_cast <void*> (p) );

如果我们使用 static_castreinterpret_cast 将指向一个类的指针转换为指向另一个类的指针会怎样?这两个运营商之间有什么区别吗?下列表达式是否相同?

    static_cast      <B*> ( static_cast      <void*> (p) );
    reinterpret_cast <B*> ( reinterpret_cast <void*> (p) );
    reinterpret_cast <B*> (                           p  );

我可以在此之后使用 B* 指针访问 b 成员吗?

1 个答案:

答案 0 :(得分:6)

<块引用>

下面的表达有什么区别吗?

static_cast      <A*> ( static_cast      <void*> (p) );
reinterpret_cast <A*> ( reinterpret_cast <void*> (p) );

没有

<块引用>

以下表达式是否相同?

static_cast      <B*> ( static_cast      <void*> (p) );
reinterpret_cast <B*> ( reinterpret_cast <void*> (p) );
reinterpret_cast <B*> (                           p  );

是的。

理解这一点的简单方法是考虑如何指定从指针到指针的 reinterpret_cast。 reinterpret_cast<T*>(ptr) 被指定为与 static_cast<T*>(static_cast<void*>(ptr)) 完全相同(为了简单起见,我省略了 cv 限定符)。

当然,static_cast<T>(static_cast<T>(anything)) 等价于 static_cast<T>(anything),因为外部转换始终是身份转换。


<块引用>

我可以在此之后使用 B* 指针访问 b 成员吗?

没有。如果你这样做了,那么程序的行为将是未定义的。

相关问题