static_cast和对指针的引用

static_cast and reference to pointers

本文关键字:指针 引用 cast static      更新时间:2023-10-16

有人能告诉我为什么不编译吗:

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*视为独立类型,否则会起作用。问题更多的是为什么这是可取的?

B是从A派生的,但B*不是从A*派生的。指向B的指针不是指向A的指针,它只能是转换为一。但类型仍然不同(转换可以而且经常会改变指针(。B*&只能指B*,不能指任何其他指针类型。

非常量左值引用(B*&(无法绑定到不相关的类型(a*(。

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

如果我们将代码重构为:

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

它将编译。

您正试图将A*强制转换为B*。这是一种错误的方式,没有多大用处。您可能希望将指向派生的指针存储在指向基的指针中,这很有用,甚至不需要强制转换。

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