C++ 对指针的静态强制转换和引用
有人能告诉我为什么这不能编译:C++ 对指针的静态强制转换和引用,c++,pointers,reference,const-cast,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; } struct A{}; 结构B:公共A{}; int main() { B B; A*A=&b; B*&b1=静态铸件(a); 返回0; } 现在,如果将静态强制转换替换为: B* b1 =
struct A { };
struct B : public A { };
int main()
{
B b;
A* a = &b;
B* &b1 = static_cast<B*&>(a);
return 0;
}
struct A{};
结构B:公共A{};
int main()
{
B B;
A*A=&b;
B*&b1=静态铸件(a);
返回0;
}
现在,如果将静态强制转换替换为:
B* b1 = static_cast<B*>(a);
B*b1=静态(a);
然后它会编译
Edit:很明显,编译器将
A*
和B*
视为独立的类型,否则这将起作用。问题更多的是为什么需要这样做?非常量左值引用(B*&)无法绑定到不相关的类型(a*)。您试图将a*
强制转换为B*
。这是一种错误的方法,不是很有用。您可能希望将派生的指针存储在指向基的指针中,这很有用,甚至不需要强制转换
我认为
dynamic\u cast
可能在这里工作,但如果我没有弄错的话,结果是定义了实现。B
是从a
派生的,但是B*
不是从a*
派生的。
指向B
的指针不是指向A
的指针,它只能是
转换成一个。但类型仍然不同(并且
转换可以而且通常会改变
指针)。AB*&
只能指AB*
,不能指任何其他
指针类型。处理引用是编译器为您做的事情,不需要强制转换为引用 如果我们将代码重构为:
B b;
A* a = &b;
B* b_ptr = static_cast<B*>(a);
B*& p1 = b_ptr;
B;
A*A=&b;
B*B_ptr=静态_投射(a);
B*&p1=B_ptr;
它将被编译。
a
不是指针的引用,它是指针。@MrListerB*&
是指向B
的指针的引用。仅供参考,动态\u cast会更有用safer@user814628仅当您不知道(由于程序逻辑)强制转换是否有效时,使用dynamic\u cast
强制编译器将运行时类型信息嵌入到该类层次结构中。再加上dynamic\u cast
相对较慢的操作,这是一个除非必要,否则您不想使用的解决方案。@user814628dynamic\u cast
在这里是不合法的。您不能使用dynamic\u cast
将a*
转换为B*&
。这是不合法的,代码也不会编译。从A*
到B*
的转换是静态转换的唯一方向。在另一个方向上,没有什么可以做的。我同意(见我的帖子),但这不一样。例如,更改p1
中的指针对象不会更改a
中的指针对象。