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 function shall not participate in overload resolution unless
is_move_constructible_v<Ti> && is_move_assignable_v<Ti> is
true for all i.
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.
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.