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
的指针,它只能是 转换成一个。但类型仍然不同(并且 转换可以而且通常会改变 指针)。A
B*&
只能指A
B*
,不能指任何其他
指针类型。

处理引用是编译器为您做的事情,不需要强制转换为引用

如果我们将代码重构为:

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
不是指针的引用,它是指针。@MrLister
B*&
是指向
B
的指针的引用。仅供参考,动态\u cast会更有用safer@user814628仅当您不知道(由于程序逻辑)强制转换是否有效时,使用
dynamic\u cast
强制编译器将运行时类型信息嵌入到该类层次结构中。再加上
dynamic\u cast
相对较慢的操作,这是一个除非必要,否则您不想使用的解决方案。@user814628
dynamic\u cast
在这里是不合法的。您不能使用
dynamic\u cast
a*
转换为
B*&
。这是不合法的,代码也不会编译。从
A*
B*
的转换是
静态转换的唯一方向。在另一个方向上,没有什么可以做的。我同意(见我的帖子),但这不一样。例如,更改
p1
中的指针对象不会更改
a
中的指针对象。