static_cast и ссылка на указатели

Может кто-нибудь сказать мне, почему это не компилируется:

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* как независимые типы, в противном случае это будет работать. Вопрос больше в том, почему это желательно?

3

Решение

B происходит от A, но B* не выводится из A*,
Указатель на B не указатель на A, это может быть только
преобразован в один. Но типы остаются разными (а
преобразование может и часто изменяет значение
указатель). B*& может относиться только к B*ни к какому другому
тип указателя

5

Другие решения

непостоянная ссылка lvalue (B *&) не может привязываться к несвязанный наберите «А*).

3

Вы пытаетесь разыграть A* к B*, Это неправильный путь и не очень полезно. Вы, вероятно, хотите сохранить указатель на производную в указателе на базу, что полезно и даже не требует приведения.

Я полагаю dynamic_cast может работать и здесь, но результат определяется реализацией, если я не ошибаюсь.

0

Обработка ссылок — это то, что компилятор делает для вас, нет необходимости приводить ссылки.

Если мы проведем рефакторинг кода в:

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

Это скомпилирует.

0
По вопросам рекламы [email protected]