AMDG On 3/2/19 3:31 PM, Niall Douglas via Boost wrote:
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
: Selects a T[x] vector<T>: Selects a T[0...N] optional<T>: Selects a T[0], or a T[1] variant: Selects one of a A[1], B[1], or C[1], with all others [0] ---
struct: Aggregate of heterogeneous types T[x]: Aggregate of x homogeneous T's array
: Aggregate of x homogeneous T's Can you see the difference yet? The first group selects an aggregate *elsewhere*. The second grouo IS an aggregate.
Nope. The second group makes sense to me. The first is just a grab bag of everything that isn't the second. In Christ, Steven Watanabe