Безопасность недействительного даункаста с использованием static_cast (или reinterpret_cast) для наследования без добавления членов

Мне было интересно, что стандарт говорит о безопасности следующего кода:

class A { int v; };
class B: public A { }; // no added data member

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

Очевидно, тип времени выполнения a является Aне BТаким образом, актерский состав не является действительно безопасным типом. Однако, поскольку не было добавлено ни одного члена и ничего не является виртуальным, IMO расположение памяти классов должно быть таким же, и это должно работать (возможно, было бы лучше написать reinterpret_cast указать это поведение?). Я думаю, что это UB, но будет работать с любым компилятором. Или это на самом деле хорошо определено? Или довольно опасно?

Кроме того, что-нибудь изменится, если B были какие-то дополнительные не виртуальные методы-члены? Опять же, интуитивно я бы сказал, нет, но мне интересно, что стандарт говорит об этом.

3

Решение

Это неопределенное поведение, независимо от того, есть виртуальная функция или нет. Стандарт гласит:

Если значение типа «указатель на cv1 B» указывает на B, то есть
на самом деле подобъект объекта типа D, результирующий указатель
указывает на вмещающий объект типа D. В противном случае результат
приведение не определено.

5

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

Других решений пока нет …

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