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?
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.