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

来自cppreference.com
< cpp‎ | ranges‎ | subrange
 
 
范围库
范围适配器
 
 
subrange() requires std::default_initializable<I> = default;
(1) (C++20 起)
constexpr subrange( /*convertible-to-non-slicing*/<I> auto i, S s )
    requires (!/*StoreSize*/);
(2) (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) (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) (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) (C++20 起)

构造 subrange

/*make-unsigned-like-t*//*different-from*/ 的定义分别见 make-unsigned-like-tdifferent-from 。

 重载  数据成员
begin_ end_ size_
(仅当 StoreSizetrue
(1) 值初始化 值初始化 0 初始化
(2) std::move(i) 初始化 s 初始化 不适用
(3) n 初始化
(4) std::move(ranges::begin(r)) 初始化 ranges::end(r) 初始化 static_cast<decltype(size_ )>
    (ranges::size(r))
初始化
(5) n 初始化
2) 如果 [is) 不是有效范围,那么行为未定义。
3) 如果满足以下任意条件,那么行为未定义:

参数

i - 代表范围起始的迭代器
s - 代表范围末尾的哨位
r - 范围
n - 大小提示,必须等于范围大小

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
P2393R1 C++20 重载 (4) 可能会以 ranges::size(r) 初始化 size_
但该值不一定能隐式转换到对应的无符号整数式类型
改成显式转换

示例