Re: Structure mapping using reinterpret_cast.
Alf P. Steinbach wrote:
* Olivier:
That is, given :
struct A { int a; int b; };
struct B { int c; };
the following code is guaranteed to work :
A a;
B &b = *reinterpret_cast<B *>(&a);
b.c = 12;
assert(a.a == b.c);
And this assert should never fail.
The above is formally guaranteed by ?9.2/17 and flatly contradicted by
?5.2.10 (in particular ?5.2.10/1 "No other conversion can be performed
explicitly").
That is both false.
Clause 9.2/17 only guarantees the following:
A a;
a.a = 0;
int* p = reinterpret_cast<int*>(&a);
*p = 42;
assert(a.a == 42);
And clause 5.2.10 does not prohibit any pointer conversions (the
conversions A* -> B* and A* -> int* are both covered by 5.2.10/7).
<snip - false conclusions>
By extension, if that is true, the following code should be
guaranteed to work :
#include <iostream>
// Base class containing the data.
class A
{
public:
A( int val = 0 ) : val_(val) { }
protected:
int get_value( ) const
{ return val_; }
private:
int val_;
};
// Interface class that uses A's data.
class B : public A
{
public:
int function( ) const
{ return get_value() / 2; }
};
// Another interface class that uses A's data.
class C : public A
{
public:
int function( ) const
{ return get_value() * 2; }
};
int main( )
{
A *a = new A(12);
B *b = reinterpret_cast<B *>(a);
std::cout << b->function() << "\n";
C *c = reinterpret_cast<C *>(a);
std::cout << c->function() << "\n";
delete a;
}
If this isn't the case, could anyone quote the entry in the standard
that states this code yields undefined behavior ?
?5.2.10/1 "No other conversion can be performed explicitly" and yours
isn't listed. Note that the above aren't POD types so ?9.2/17 does not
apply.
The conversion is listed in 5.2.10/7. 9.2/17 does indeed not apply, but
what makes the code have UB is clause 3.10/15.
Cheers & hth.,
- Alf
Bart v Ingen Schenau
--
a.c.l.l.c-c++ FAQ: http://www.comeaucomputing.com/learn/faq
c.l.c FAQ: http://c-faq.com/
c.l.c++ FAQ: http://www.parashift.com/c++-faq-lite/
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]