I vote *ACCEPT*.
*Design*
I consider it a shortcoming that std::variant does not have the
never-valueless guarantee of variant2. The point of variant is that
after a successful initialization, it will either have a valid A or a valid
B. If I wanted to have to deal with some other alternative, I would have
specified a third type.
The main objection to the never-valueless semantics is that after a failed
assignment, the programmer could be surprised to find that the target
variant object may have switched from a valid value of the previously
stored type, to a valid value of one of the other alternative types. While
it is true that the change of type can be surprising, this is the good old
basic guarantee in action -- nothing less, nothing more.
I also like the addition of the narrowing operation subset