Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
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-t different-from

重载 数据成员
begin_ end_ size_
(仅当 StoreSize true 时)
(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) 如果 [ i , s ) 不是有效的 范围 ,则行为未定义。
3) 若满足以下任意条件,则行为未定义:

参数

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

示例

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 适用范围 发布时的行为 正确行为
P2393R1 C++20 对于重载版本 ( 4 ) size_ 可能使用 ranges:: size ( r ) 初始化,但该值
并不总能隐式转换为对应的 unsigned-integer-like 类型
将转换
改为显式进行