That's not the point. The point is that only one member is within its lifetime. You're not allowed to read a value outside of its lifetime, that's UB.
union U {
A a;
B b;
};
U u;
u.a = A(); // u.a becomes active member
B b = u.b; // Undefined behavior: you cannot read u.b,
// because it's not the active member, so it's not
// within its lifetime and its value doesn't even
// exist as far as the standard and the optimizer
// are concerned.
In no way does this mean that the other members are inaccessible or have undetermined values.
No, the consequences are even more profound: the compiler can generate code that does anything. It's not even guaranteed that you get an undetermined value. Please see the definition of Undefined Behavior again, as well as the examples on cppreference.
That's not allowed.
char buffer[sizeof(float)] {};
float *p = reinterpret_cast<float *>(buffer);
float f = *p; // UB: you're accessing an object of type “array of char”
// through a glvalue of type “float”, which is not similar
// to “(array of) char”.
OTOH, you are allowed to access a float through a char/byte pointer, but not the other way around.
float f = 1.234f;
char *p = reinterpret_cast<char *>(&f);
char c = *p; // Ok (11.3)