You see, I would consider any union-based storage as in the same category. By definition union-based storage must contain a "pointer" to the correct way to interpret that union-based storage.
I don't understand this. Andrzej says pointers and means it literally: T*. You say "pointers" and I have no idea what you mean by it and what relation it has to exception safety.
If an object *selects* another object, then in my opinion it needs to
propagate the strongest possible exception guarantees it can for
assignment, swap and emplace.
If an object *aggregates* other objects, then in my opinion it is
permitted to have partial operations. So swap can get half way into
swapping the individual members in the aggregate, and bail out.
This might help:
T*: Selects a T[1...N]
unique_ptr