A regular type is a type that behave likes an int. In which it is
- default constructible
- support all of the special member functions
- swappable
- and equality comparable
A semi-regular type is the same to the regular type except there are no requirement on equality comparable:
namespace std {
template <class T>
concept semiregular = std::copyable<T> && std::default_initializable<T>;
template <class T>
concept regular = std::semiregular<T> && std::equality_comparable<T>;
}