谁能告诉我为什么这不能编译:
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*andB*视为独立类型,否则这将起作用。问题更多是关于为什么这是可取的?
谁能告诉我为什么这不能编译:
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*andB*视为独立类型,否则这将起作用。问题更多是关于为什么这是可取的?
B派生自A,但B*不派生自A*。指向 aB的指针不是指向 a 的指针A,它只能转换为一个。但是类型仍然不同(并且转换可以而且经常会改变指针的值)。AB*&只能引用 a B*,不能引用任何其他指针类型。
非常量左值引用 (B*&) 不能绑定到不相关的类型 (A*)。
您正在尝试将 anA*转换为B*. 这是错误的方法,不是很有用。您可能希望将派生的指针存储在指向基址的指针中,这很有用,甚至不需要强制转换。
我想 adynamic_cast可能在这里工作,但如果我没记错的话,结果是实现定义的。
处理引用是编译器为你做的事情,不需要强制转换为引用。
如果我们将代码重构为:
B b;
A* a = &b;
B* b_ptr = static_cast<B*>(a);
B*& p1 = b_ptr;
它会编译。