Код: Выделить всё
struct A {
int index;
}
struct B: A {}
static_assert(std::is_standard_layout_v, "test");
static_assert(std::is_standard_layout_v, "test");
Два объекта A и B являются pointer-interconbentable if: < /p>
Один из них является стандартным объектом класса, а другой-первые нестатические данные, которые объектно-объект,
или, если объект не имеет non-static data of Data, есть элемент-элемент-элемент, который нет. (11.4), или < /li>
< /ul>
< /blockquote>
Это означает, что следующий код должен быть разрешен: < /p>
Код: Выделить всё
A a = {};
int* i = reinterpret_cast(&a);
B* b = reinterpret_cast(i);
Правила для типового доступного не совсем понятны для меня после прочтения описания, кажется, что динамический тип B -A., поскольку это относится к типичному алиасному правилам, поэтому следующий вопрос будет, если-то, если-fno-strict-alias позволит обратить это. Люди задаются вопросом о контексте. Это из устаревшей кодовой базы, где A имеет некоторые аксессуры, а B (и многие другие производные типы) - это по существу разные представления об этом базовом объекте, и иногда необходимо преобразовать между этими типами (и в фактической реализации это дорого). В то время, когда люди, с тех пор, как выравнивание и размер одинаковы, такие акции были бы надежными и дешевле, чем явные конструкции. Однако, в целом, это не является случаем. К сожалению, я не смог найти ни одного флага компилятора или дезинфицирующего средства, которое на самом деле показывает, что это UB или смог построить пример, где это идет не так.
Подробнее здесь: https://stackoverflow.com/questions/795 ... ard-layout