I'll ask the same I asked Peter, because I no longer see the value in never-empty guarantee.
If I have two objecte of type variant, where A, B can throw on copy/move, and C is trivial:
``` variant a = A{}, b = B{};
try { a = b; // throws } catch(...) {}
// at this point a holds a C ```
What good does it make to me that I had an A, wanted to assign a B and got a C?
Why would you get a C in 'a'? 'a' previously was set to A. The assignment of 'b' with B state to 'a' failed due to exception. So the strong never empty guarantee implemented by both Outcome and Expected means that 'a' still contains its original A untouched and undamaged. 'b' also contains its B untouched and undamaged, though that is up to B's copy constructor. Niall -- ned Productions Limited Consulting http://www.nedproductions.biz/ http://ie.linkedin.com/in/nialldouglas/