@@ -150,11 +150,14 @@ inline constexpr primary_construct_t primary_construct{};
150150// being an assignment operator at all ([class.copy.assign]/1).
151151// - A `= default` assignment operator whose constraints are not satisfied makes them declare an
152152// implicit move assignment, and the implicit assignment operators of a derived class are
153- // computed from it. A deleted declaration that is selected exactly when neither of the other two
154- // is prevents this.
153+ // computed from it. An additional declaration that is selected exactly when neither of the
154+ // other two is prevents this: a deleted copy assignment, and a move assignment that forwards to
155+ // the copy assignment (or a deleted one if the copy assignment is not usable either), because
156+ // a move assignment that does not participate must fall back to the copy assignment.
155157// Constructors and destructors are not affected.
156158struct rvariant_not_copy_assignable { rvariant_not_copy_assignable() = delete ; };
157159struct rvariant_not_move_assignable { rvariant_not_move_assignable() = delete ; };
160+ struct rvariant_not_move_assignable_fallback { rvariant_not_move_assignable_fallback() = delete ; };
158161#endif
159162
160163template <class ... Ts>
@@ -359,10 +362,29 @@ IRIS_RVARIANT_ALWAYS_THROWING_UNREACHABLE_END
359362 }
360363
361364#if defined(__INTELLISENSE__) || defined(__RESHARPER__)
365+ constexpr rvariant& operator =(
366+ std::conditional_t <
367+ (!detail::rvariant_trivially_move_assignable<Ts...>) &&
368+ (!detail::rvariant_move_assignable<Ts...>) &&
369+ detail::rvariant_copy_assignable<Ts...>,
370+ rvariant,
371+ detail::rvariant_not_move_assignable_fallback
372+ >&& rhs
373+ )
374+ noexcept (detail::rvariant_nothrow_copy_assignable<Ts...>)
375+ requires
376+ (!detail::rvariant_trivially_move_assignable<Ts...>) &&
377+ (!detail::rvariant_move_assignable<Ts...>) &&
378+ detail::rvariant_copy_assignable<Ts...>
379+ {
380+ return *this = static_cast <rvariant const &>(rhs);
381+ }
382+
362383 constexpr rvariant& operator =(rvariant&&)
363384 requires
364385 (!detail::rvariant_trivially_move_assignable<Ts...>) &&
365- (!detail::rvariant_move_assignable<Ts...>)
386+ (!detail::rvariant_move_assignable<Ts...>) &&
387+ (!detail::rvariant_copy_assignable<Ts...>)
366388 = delete ;
367389#endif
368390
0 commit comments