Niall Douglas wrote:
I don't understand. variant<...> knows exactly what the alternatives are.
It doesn't know what they mean though. Doesn't know that T1 is the value and T2 is the error.
It surely would be straightforward to look at some Arg&&... sequence and do std::is_constructible
matching against all possible variant states.
The one-argument variant constructor performs overload resolution across all alternatives and chooses the best match (if one exists.) This makes it possible for it to sometimes surprise the user with its choice. Extending this to multiple arguments would be possible in principle, but it's not that straightforward as you make it seem. It's not just a matter of checking is_constructible. You need to choose the best match.
The fact they don't do it I surely think is a deliberate and intentional design choice for some hopefully good reason.
I'm not so sure. `variant` is very tricky to specify, and from a certain point on, people were so tired of the endless discussions that they shot any new suggestion down regardless of merits if it had the potential to generate further controversy. I don't remember this even being proposed, but had it been proposed, it would probably have been rejected summarily without any deliberation, because it's pretty subtle.