std::ranges::subrange<I,S,K>::subrange

From cppreference.com
< cpp‎ | ranges‎ | subrange
Ranges library
Range adaptors
subrange( ) requires std::default_initializable <I> = default ;
(1) (since C++20)
constexpr subrange( /*convertible-to-non-slicing*/ <I> auto i, S s )
    requires ( ! /*StoreSize*/ ) ;
(2) (since C++20)
constexpr subrange( /*convertible-to-non-slicing*/ <I> auto i, S s,

/*make-unsigned-like-t*/ < std::iter_difference_t <I>> n )

    requires (K == ranges:: subrange_kind :: sized ) ;
(3) (since C++20)
template < /*different-from*/ <subrange> R >

requires ranges::borrowed_range <R> &&
/*convertible-to-non-slicing*/ < ranges::iterator_t <R>, I> &&
std::convertible_to < ranges::sentinel_t <R>, S>
constexpr subrange( R&& r )

    requires ( ! /*StoreSize*/ || ranges::sized_range <R> ) ;
(4) (since C++20)
template < ranges::borrowed_range R>

requires /*convertible-to-non-slicing*/ < ranges::iterator_t <R>, I> &&
std::convertible_to < ranges::sentinel_t <R>, S>
constexpr subrange( R&& r,
/*make-unsigned-like-t*/ < std::iter_difference_t <I>> n )
    requires (K == ranges:: subrange_kind :: sized )

: subrange{ ranges::begin (r), ranges::end (r), n} { }
(5) (since C++20)

Constructs a subrange.

For the definitions of /*make-unsigned-like-t*/ and /*different-from*/, see make-unsigned-like-t and different-from

Overload  Data members
begin_ end_ size_
(only if StoreSize is true
(1) value-initialized value-initialized initialized with 0
(2) initialized with std::move(i) initialized with s N/A
(3) initialized with n
(4) initialized with std:: move ( ranges::begin (r) ) initialized with ranges::end(r) initialized with static_cast<decltype( size_ )>
(ranges::size(r))
(5) initialized with n
2) If [is) is not a valid range
3) If any of the following conditions is satisfied, the behavior is undefined:

Parameters

i - iterator that denotes the beginning of the range
s - sentinel that denotes the end of the range
r - range
n - size hint, must be equal to the size of the range

Example

Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
P2393R1 C++20 for overload (4), size_ might be initialized with ranges::size(r), but it is
not always implicitly convertible to the corresponding unsigned-integer-like
made the
conversion explicit