static_cast VS reinterpret_cast when casting pointers to pointers

c++, reinterpret-cast, static-cast

Solution

is there any difference between the following expressions?

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

No.

Are the following expressions the same?

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

Yes.

Easy way to understand this is to think about how reinterpret_cast from pointer to pointer is specified. `reinterpret_cast<T*>(ptr)` is specified to behave exactly the same as `static_cast<T*>(static_cast<void*>(ptr))` (I've left out cv qualifiers for simplicity).

And of course, `static_cast<T>(static_cast<T>(anything))` is equivalent to `static_cast<T>(anything)` because the outer cast is always an identity conversion.

Can I use B* pointer after this to access b member?

No. If you did that, then the behaviour of the program would be undefined.

Problem

Given the following conditions: ``` struct A { int a; }; struct B { int b; }; int main() { A a {1}; A* p = &a; ``` Does casting with `static_cast` and with `reinterpret_cast` via `void*` give the same result? I.e is there any difference between the following expressions? ``` static_cast <A*> ( static_cast <void*> (p) ); reinterpret_cast <A*> ( reinterpret_cast <void*> (p) ); ``` What if we cast pointer to one class to pointer to another class with `static_cast` and with `reinterpret_cast`? Is there any difference between these two operators? Are the following expressions the same? ``` static_cast <B*> ( static_cast <void*> (p) ); reinterpret_cast <B*> ( reinterpret_cast <void*> (p) ); reinterpret_cast <B*> ( p ); ``` Can I use `B*` pointer after this to access `b` member?

Original source