2017-06-09 1:05 GMT+02:00 Gavin Lambert via Boost
On 9/06/2017 01:22, Andrzej Krzemienski wrote:
2017-06-08 15:01 GMT+02:00 Peter Dimov:
I'm not sure I understand this fully; could you please explain from what
expressions, and under what conditions, you expect the strong guarantee?
variant
v1, v2; X x; v1= v2; // do you expect strong guarantee here? v1 = std::move(v2); // here? v1 = x; // here? v1 = std::move(x); // here? v1.emplace<X>(); // here?
Anyone? This is a genuine inquiry. How can I give you strong guarantee if you don't tell me when and where you want it?
Maybe nobody needs the strong guarantee? This is definitely the case for my programs. I put variants in different containers. But if exception is thrown while modifying them I am destroying the entire data structure. I do not need the previous state. If I cannot put the new one, I cannot proceed anyway.
(I am not saying such guarantee is useless. I just observe that the need occurred in my programs.)
The only case that I can think of at the moment is for something like a state machine, where each type in the variant is a possible state and the current value is the current state. If a transition fails via throwing from the new state constructor then presumably the state machine should remain in the previous state.
It is funny that you should say that. I remember I wanted at some point to test one of Boost's state machines in my toy projects, and I had the exact opposite expectation: when the the new state B was being initialized I wanted to be able to still access the previous state A, to steal (move) some data from it. Regards, &rzej;