static_cast和对指针的引用

时间:2013-01-17 15:44:05

标签: c++ pointers reference const-cast

任何人都可以告诉我为什么不编译:

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

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

现在,如果用以下内容替换静态强制转换:

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

然后它会编译。

编辑:很明显,编译器会将A*B*视为独立类型,否则会起作用。问题更多的是为什么这是可取的?

4 个答案:

答案 0 :(得分:5)

B源自A,但B*并非来自A*。 指向B的指针不是指向A的指针,它只能是B*& 转换为一个。但类型仍然不同(和 转换可以并且经常会改变价值 指针)。 B*只能引用{{1}},而不能指代任何其他{{1}} 指针类型。

答案 1 :(得分:3)

非常数左值引用(B *&amp;)无法绑定到不相关的类型(A *)。

答案 2 :(得分:0)

您正在尝试将A*投射到B*。这是错误的方式,并不是很有用。您可能希望将指针存储在指向base的指针中,这很有用,甚至不需要强制转换。

我认为dynamic_cast可能在这里工作,但如果我没有弄错的话,结果就是实现定义。

答案 3 :(得分:0)

编译器处理引用是为你做的,不需要转换为引用。

如果我们将代码重构为:

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

它会编译。