Предположим, у нас есть два типа, которые имеют одинаковое представление (одинаковые переменные-члены и базовые классы, в одном и том же порядке)Это действительно (то есть не UB) для reinterpret_cast
между ними? Например, это действительно до reinterpret_cast
от Mary
до Ashley&
? А что, если эти два типа полиморфны?
struct Mary {
int m1;
char m2;
};
struct Ashley {
int a1;
char a2;
};
int TryTwins ()
{
Mary mary = {};
Ashley& ashley = reinterpret_cast<Ashley&> (mary);
ashley.a1 = 1;
ashley.a2 = 2;
return mary.m1 + mary.m2;
}
Что если мы приведем начало объекта к другому типу, если мы знаем, что тип источника начинается с переменных-членов целевого типа? Например, это допустимо (т.е. не UB)?
struct Locomotive {
int engine;
char pantograph;
};
struct Train {
int engine;
char pantograph;
int* wagon1;
int** wagon2;
int*** wagon3;
};
int TryTrain ()
{
Train train = {};
Locomotive& loc = reinterpret_cast<Locomotive&> (train);
loc.engine = 1;
loc.pantograph = 2;
return train.engine + train.pantograph;
}
Обратите внимание, что все основные компиляторы рассматривают их как допустимые приведения ( live demo ). Вопрос в том, позволяет ли это язык C ++.