任何人都可以告诉我为什么不编译:
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*
视为独立类型,否则会起作用。问题更多的是为什么这是可取的?
答案 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;
它会编译。