Otherwise, if either is_nothrow_copy_constructible_v<Tj>
is true or
is_nothrow_move_constructible_v<Tj> is false,
equivalent to emplace<j>(get<j>(rhs)).
Remarks: This operator is defined as deleted unless
is_copy_constructible_v<Ti>&&is_copy_assignable_v<Ti>
is true for all i.
If is_trivially_copy_constructible_v<Ti>&&is_trivially_copy_assignable_v<Ti>&&is_trivially_destructible_v<Ti>
is true for all i, this assignment operator is trivial.
Remarks: If is_trivially_move_constructible_v<Ti>&&is_trivially_move_assignable_v<Ti>&&is_trivially_destructible_v<Ti>
is true for all i, this assignment operator is trivial.
The expression inside noexcept is equivalent to
is_nothrow_move_constructible_v<Ti>&& is_nothrow_move_assignable_v<Ti> for all i.
If an exception is thrown during the call to Tj's move assignment,
the state of the contained value is as defined by the exception safety
guarantee of Tj's move assignment; index() will be j.
Let Tj be a type that is determined as follows:
build an imaginary function FUN(Ti)
for each alternative type Ti
for which Ti x[]={std::forward<T>(t)};
is well-formed for some invented variable x.
The overload FUN(Tj) selected by overload
resolution for the expression FUN(std::forward<T>(t)) defines
the alternative Tj which is the type of the contained value after
assignment.
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.