Безопасность недействительного даункаста с использованием static_cast (или reinterpret_cast) для наследования без добавления членов
Мне было интересно, что стандарт говорит о безопасности следующего кода:
class A { int v; };
class B: public A { }; // no added data member
A a;
B& b = static_cast(a);
Очевидно, тип времени выполненияa
являетсяA
неB
Таким образом, актерский состав не является действительно безопасным. Тем не менее, поскольку не было добавлено ни одного члена и ничего не является виртуальным, IMO расположение памяти классов должно быть одинаковым, и это должно работать (возможно, было бы лучше написатьreinterpret_cast
указать это поведение?). Я думаю, что это UB, но будет работать с любым компилятором. Или это на самом деле хорошо определено? Или довольно опасно?
Кроме того, что-нибудь изменится, еслиB
были какие-то дополнительные не виртуальные методы-члены? Опять же, интуитивно я бы сказал, нет, но мне интересно, что стандарт говорит об этом.