Question

Can anyone tell me why this doesn't compile:

struct A { };
struct B : public A { };

int main()
{
  B b;
  A* a = &b;
  B* &b1 = static_cast<B*&>(a);
  return 0;
}

Now, if you replace the static cast with:

B* b1 = static_cast<B*>(a);

then it does compile.

Edit: It is obvious that the compiler treats A* and B* as independent types, otherwise this would work. The question is more about why is that desirable?

Was it helpful?

Solution

B is derived from A, but B* isn't derived from A*. A pointer to a B is not a pointer to an A, it can only be converted to one. But the types remain distinct (and the conversion can, and often will, change the value of the pointer). A B*& can only refer to a B*, not to any other pointer type.

OTHER TIPS

non-constant lvalue reference (B*&) cannot bind to a unrelated type (A*).

You are trying to cast an A* to a B*. This is the wrong way around and not very useful. You probably want to store a pointer to derived in a pointer to base, which is useful and doesn't even need a cast.

I suppose a dynamic_cast might work here, but the result is implementation defined if I'm not mistaken.

Handling of references is something the compiler does for you, there should be no need to cast to reference.

If we refactor the code to:

B b;
A* a = &b;
B* b_ptr = static_cast<B*>(a);
B*& p1 = b_ptr;

It will compile.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top