Как указывалось в других ответах, объединение является наиболее очевидным способом организации этого.
Это еще более четкий пример того, как частично перекрывающиеся объекты могут возникать при использовании встроенного оператора присваивания.Этот пример не показал бы UB, если бы не ограничения частично перекрывающихся объектов.
union Y {
int n;
short s;
};
void test() {
Y y;
y.s = 3; // s is the active member of the union
y.n = y.s; // Although it is valid to read .s and then write to .x
// changing the active member of the union, .n and .s are
// not of the same type and partially overlap
}
Вы можете получить потенциальное частичное перекрытие даже с объектами того же типа.Рассмотрим этот пример в случае, когда short
строго больше, чем char
в реализации, которая не добавляет заполнение к X
.
struct X {
char c;
short n;
};
union Y {
X x;
short s;
};
void test() {
Y y;
y.s = 3; // s is the active member of the union
y.x.n = y.s; // Although it is valid to read .s and then write to .x
// changing the active member of the union, it may be
// that .s and .x.n partially overlap, hence UB.
}