This section describes concepts that specify the basis of the value-oriented programming style on which the library is based.
template <class T>
concept bool Movable =
is_object<T>::value &&
MoveConstructible<T> &&
Assignable<T&, T> &&
Swappable<T>;
There need not be any subsumption relationship between Movable<T> and is_object<T>::value.
template <class T>
concept bool Copyable =
CopyConstructible<T> &&
Movable<T> &&
Assignable<T&, const T&>;
template <class T>
concept bool Semiregular =
Copyable<T> &&
DefaultConstructible<T>;
[ Note: The Semiregular concept is satisfied by types that behave similarly to built-in types like int, except that they may not be comparable with ==. — end note ]
template <class T>
concept bool Regular =
Semiregular<T> &&
EqualityComparable<T>;
[ Note: The Regular concept is satisfied by types that behave similarly to built-in types like int and that are comparable with ==. — end note ]