Remarks:
This function shall not participate in overload resolution unless
is_move_constructible_v<> && is_move_assignable_v<> is
true for all i.
The expression inside noexcept is equivalent to:
is_nothrow_move_constructible_v<> && is_nothrow_move_assignable_v<> for all i.
If an exception is thrown during the call to 's move assignment,
the state of the contained value is as defined by the exception safety
guarantee of 's move assignment; index() will be j.
Let be a type that is determined as follows:
build an imaginary function FUN() for each alternative type
.
The overload FUN() selected by overload
resolution for the expression FUN(std::forward<T>(t)) defines
the alternative which is the type of the contained value after
assignment.
Remarks:
This function shall not participate in overload resolution unless
is_same_v<decay_t<T>, variant> is false, unless
is_assignable_v<&, T> && is_constructible_v<, T> is true,
and unless the expression FUN(std::forward<T>(t)) (with
FUN being the above-mentioned set of imaginary functions)
is well formed.
If an exception is thrown during the assignment of std::forward<T>(t)
to the value contained in *this, the state of the contained value and
t are as defined by the exception safety guarantee of the assignment
expression; valueless_by_exception() will be false.