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++ 标准。

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