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>;
}