template <class T, class U>
concept bool Assignable =
is_lvalue_reference<T>::value && // see below
CommonReference<
const remove_reference_t<T>&,
const remove_reference_t<U>&> &&
requires(T t, U&& u) {
{ t = std::forward<U>(u) } -> Same<T>&&;
};
Let t be an lvalue that refers to an object o such that decltype((t)) is T, and u an expression such that decltype((u)) is U. Let u2 be a distinct object that is equal to u. Assignable<T, U> is satisfied only if
addressof(t = u) == addressof(o).
After evaluating t = u:
t is equal to u2, unless u is a non-const xvalue that refers to o.
If u is a non-const xvalue, the resulting state of the object to which it refers is valid but unspecified ( ISO/IEC 14882:2014 §[lib.types.movedfrom]).
Otherwise, if u is a glvalue, the object to which it refers is not modified.
There need not be any subsumption relationship between Assignable<T, U> and is_lvalue_reference<T>::value.
[ Note: Assignment need not be a total function ([structure.requirements]); in particular, if assignment to an object x can result in a modification of some other object y, then x = y is likely not in the domain of =. — end note ]