c++ - reinterpret_cast from object to first member -


i looking @ answer , wondering if casting object first member reinterpret_cast , using result safe in c++.

let's assume have class a, class b , instance b of b:

class a{ public:     int i;     void foo(){} };  class b{ public:     a; };  b b; 

question 1: is safe use b.a this: reinterpret_cast<a*>(&b)->foo()?

note: in general case suppose class , member both standard layout.

my lecture of available references on reinterpret_cast tells me such usage should authorized there no aliasing violation, conflicts many answers this one.

question2: is safe use b.a this: static_cast<a*>(static_cast<void*>(&b))->foo()?

yes, because both classes here standard-layout types, can convert between &b , &b.a.

reinterpret_cast<a*>(p) defined same static_cast<a*>(static_cast<void*>(p)), (5.2.10p7) both questions equivalent.

for standard-layout classes, address of struct/class same address of first non-static member (9.2p19). , static_cast to/from void* preserve address (5.2.9p13), meaning result valid.

if classes not standard-layout, not rely on behavior.


Comments