Re: Foward decleration casting craziness
speedplane wrote:
Hi there...
I've read through other responses, and it seems to me they've missed the
point. The following is the code in question (with few corrections and
modifications).
struct C;
struct A
{
C * getAasC()
{
return (C*)this;
};
int a;
};
struct B
{
int b;
};
struct C : public B, public A
{
int c;
};
int main()
{
A * a = new C();
a->getAasC()->c = 50;
}
The relevant paragraph [5.4/6] states:
The operand of a cast using the cast notation can be an rvalue of
type ?pointer to incomplete class type?. The destination type of a
cast using the cast notation can be ?pointer to incomplete class
type?. In such cases, even if there is a inheritance relationship
between the source and destination classes, whether the static_cast
or reinterpret_cast interpretation is used is unspecified.
Whether the above program is a subject to Undefined Behavior is
unspecified, but the program is well-formed and should compile. On
MSVC8, reinterpret_cast is done, resulting in possible memory
corruption. That is, however, not a compiler bug. I agree that a warning
can be issued, that's, however, beyond Standard's control.
--
Martin
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]