Почему нельзя использовать static_cast для понижающего преобразования, когда задействовано виртуальное наследование?

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

struct Base {};
struct Derived : public virtual Base {};

void f()
{
    Base* b = new Derived;
    Derived* d = static_cast<Derived*>(b);
}

Это запрещено стандартом ( [n3290: 5.2.9 / 2] ), поэтому код не компилируется, потому что Derived виртуально наследуется от Base . Удаление виртуального из наследования делает код действительным.

Какова техническая причина существования этого правила?

40
задан Lightness Races with Monica 20 September 2011 в 12:44
поделиться