```
constexpr variant& operator=(const variant& rhs);
```

- Otherwise, if *this holds a value but rhs does not, destroys the value contained in *this and sets *this to not hold a value.
- Otherwise, if either is_nothrow_copy_constructible_v<> is true or is_nothrow_move_constructible_v<> is false, equivalent to emplace<j>(get<j>(rhs)).
- Otherwise, equivalent to operator=(variant(rhs)).

`constexpr variant& operator=(variant&& rhs) noexcept(`*see below*);

The exception specification 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 construction (with j being rhs.index()), the variant will hold no value.
- 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.

`template<class T> constexpr variant& operator=(T&& t) noexcept(`*see below*);

Let be a type that is determined as follows:
build an imaginary function *FUN*()
for each alternative type
for which x[] = {std::forward<T>(t)};
is well-formed for some invented variable x.

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.

- is_same_v<remove_cvref_t<T>, variant> is false,
- is_assignable_v<&, T> && is_constructible_v<, T> is true, and
- 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.
- If an exception is thrown during the initialization of the contained value, the variant object is permitted to not hold a value.