std::ranges::common_range(3)

NAME
std::ranges::common_range - std::ranges::common_range

Synopsis
   Defined in header <ranges>
   template< class T >
     concept common_range = (since C++20)
       ranges::range<T> && std::same_as<ranges::iterator_t<T>,
   ranges::sentinel_t<T>>;
   The common_range concept is a refinement of range for which std::ranges::begin() and
   std::ranges::end() return the same type (e.g. all standard library containers).

Example
// Run this code
 #include <ranges>
 struct A {
     char* begin();
     char* end();
 };
 static_assert( std::ranges::common_range<A> );
 struct B {
     char* begin();
     bool end();
 }; // not a common_range: begin/end have different types
 static_assert( not std::ranges::common_range<B> );
 struct C {
     char* begin();
 }; // not a common_range, not even a range: has no end()
 static_assert( not std::ranges::common_range<C> );
 int main() { }

See also
   ranges::common_view converts a view into a common_range
   views::common (class template) (range adaptor object)
   (C++20)