У меня есть стандартный макет, в котором есть целая куча типов:
union Big {
Hdr h;
A a;
B b;
C c;
D d;
E e;
F f;
};
Каждый из типов A
через F
является стандартным макетом и имеет в качестве первого члена объект типа Hdr
. Hdr
определяет, что является активным членом союза, так что это вариант. Теперь я в ситуации, когда я точно знаю (потому что я проверил), что активный член является либо B
либо C
Фактически я сократил пространство до:
union Little {
Hdr h;
B b;
C c;
};
Итак, следующее четко определенное или неопределенное поведение?
void given_big(Big const& big) {
switch(big.h.type) {
case B::type: // fallthrough
case C::type:
given_b_or_c(reinterpret_cast<Little const&>(big));
break;
// ... other cases here ...
}
}
void given_b_or_c(Little const& little) {
if (little.h.type == B::type) {
use_a_b(little.b);
} else {
use_a_c(little.c);
}
}
Цель Little
- эффективно служить в качестве документации, что я уже проверил, что это B
или C
поэтому в будущем никто не добавляет код, чтобы проверить, что это A
или что-то в этом роде.
Является ли тот факт, что я читаю подобъект B
как B
достаточно, чтобы сделать это хорошо сформированным? Можно ли использовать здесь общее правило исходной последовательности?