[ub] type punning through congruent base class?

Gabriel Dos Reis gdr at axiomatics.org
Mon Jan 6 15:33:23 CET 2014


"Fabio Fracassi" <f.fracassi at gmx.net> writes:

| Hello UB-Experts,
|  
| as far as I can see the following (static_cast) is UB:
|  
| struct B {
|   int i;
| };
|  
| struct D : B {
|   void foo() { /* access B::i */ }
| };
|  
| B b;
| static_cast<D&>(b).foo();
|  
| because of [expr.static.cast] clause 11
|  
| first question: is my assessment of the situation correct or is this
| use legal?
| if it is not (legal): could we make it legal or would we run afoul of
| the aliasing rules?

Yes, it is undefined behavior -- you're referring to an inexistent
(sub)object of type D.

Why can't you create an object of type D if your program needs it?  Why
is it a hardship?

-- Gaby


More information about the ub mailing list