Может кто-нибудь сказать мне, почему это не компилируется:
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*
ни к какому другому
тип указателя
непостоянная ссылка lvalue (B *&) не может привязываться к несвязанный наберите «А*).
Вы пытаетесь разыграть A*
к B*
, Это неправильный путь и не очень полезно. Вы, вероятно, хотите сохранить указатель на производную в указателе на базу, что полезно и даже не требует приведения.
Я полагаю dynamic_cast
может работать и здесь, но результат определяется реализацией, если я не ошибаюсь.
Обработка ссылок — это то, что компилятор делает для вас, нет необходимости приводить ссылки.
Если мы проведем рефакторинг кода в:
B b;
A* a = &b;
B* b_ptr = static_cast<B*>(a);
B*& p1 = b_ptr;
Это скомпилирует.