Почему статическое приведение съедает ссылку?

Рассмотрим следующий код:

struct base {};
struct derived : public base {};

int main() {
    derived d = {};
    derived* ptr_d = &d;
    derived*& ref_ptr_d = ptr_d;

    base*& ref_ptr_b = static_cast<base*&>(ref_ptr_d); // this won't compile
    (void) ref_ptr_b;
    return 0;
}

Почему ref_ptr_d интерпретируется как derived* вместо derived*&, а приведение недействительно?

Я могу воспроизвести его на компиляторах MSVC и gcc.


person ivaigult    schedule 27.07.2017    source источник
comment
Так работает ссылка. Это просто замещающее имя. Везде, где у вас есть эталонное имя, притворяйтесь, что у вас есть исходное имя.   -  person NathanOliver    schedule 27.07.2017
comment
Дубликат был самым первым попаданием в Google из-за [переполнение стека, недопустимая ссылка приведения к указателю].   -  person John Zwinck    schedule 27.07.2017
comment
нет никакой разницы между int a, &b=a, &c=b; и int a, &b=a, &c=a;. В обоих случаях a, b и c — одно и то же.   -  person Kevin    schedule 27.07.2017