std::experimental::ranges::Range
From cppreference.com
 
 
 < cpp | experimental | ranges 
 
 
 C++ 
 Feature test macros (C++20)
 Concepts library (C++20)
 Metaprogramming library (C++11)
 Ranges library (C++20)
 Filesystem library (C++17)
 Concurrency support library (C++11)
 Execution control library (C++26)
Experimental 
 Filesystem library (filesystem TS)
 Library fundamentals (library fundamentals TS)
 Library fundamentals 2 (library fundamentals TS v2)
 Library fundamentals 3 (library fundamentals TS v3)
 Extensions for parallelism (parallelism TS)
 Extensions for parallelism 2 (parallelism TS v2)
 Extensions for concurrency (concurrency TS)
 Extensions for concurrency 2 (concurrency TS v2)
 Concepts (concepts TS)
 Ranges (ranges TS)
 Reflection (reflection TS)
 Mathematical special functions (special functions TR)
Ranges library 
   
 Range concepts
 Range access
 Range primitives
Defined in header 
 
 
<experimental/ranges/range> 
 template< class T >
 
 (ranges TS) 
concept bool Range =
    requires(T&& t) {
        ranges::begin (t); /* not necessarily equality-preserving (see below) */
        ranges::end (t);
Given an lvalue t of type std::remove_reference_t <T>, Range<T> is satisfied only if
-  [ranges::begin (t),ranges::end (t))denotes a range; and
- both ranges::begin (t) and ranges::end (t) are amortized constant time and non-modifying.
-  If ranges::iterator_t <T> satisfies ForwardIterator, ranges::begin (t) is equality preserving.