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

来自cppreference.com
< cpp‎ | ranges‎ | subrange
 
 
范围库
范围访问
范围转换器
(C++23)
范围原语



悬垂迭代器处理
范围概念
视图

范围工厂
适配器
范围生成器
范围适配器对象
范围适配器闭包对象
辅助项
 
std::ranges::subrange
成员函数
subrange::subrange
(C++20)
观察器
迭代器操作
推导指引
非成员函数
(C++20)
辅助类型
(C++20)
 
subrange() requires std::default_initializable<I> = default;
(1) (C++20 起)
constexpr subrange( /*convertible-to-non-slicing*/<I> auto i, S s )
  requires (!/*store-size*/);
(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 (!/*store-size*/ || 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

K == ranges::subrange_kind::sized && !std::sized_sentinel_for<S, I> ,则存储范围大小到 subrange 中,如同用 /*make-unsigned-like-t*/<std::iter_difference_t<I>> 类型的成员子对象存储,其中 make-unsigned-like-t 是仅用于阐释的别名模板,将每个整数式类型映射到其对应的无符号版本。否则不存储大小。若存储大小则常量 store-sizetrue ,否则为 false

1) 默认构造函数。值初始化存储的迭代器与哨位,如同分别用默认成员初始化器 = I()= S() 。若存储大小,则将它初始化为 0 ,如同通过默认成员初始化器 = 0
2) 从迭代器-哨位对构造 subrange 。分别以 std::move(i)s 初始化存储的迭代器与哨位。若 [i, s) 不是合法范围则行为未定义。
3) 从迭代器-哨位对与大小提示构造 subrange 。分别以 std::move(i)s 初始化存储的迭代器与哨位。若存储大小,则以 n 初始化它。若 [i, s) 不是合法范围,或 n 不等于显式转换到其类型的 ranges::distance(i, s) 则行为未定义。
4) 从范围构造 subrange 。若存储大小则等价于 subrange(r, static_cast</*make-unsigned-like-t*/<std::iter_difference_t<I>>>(ranges::size(r))) 。否则等价于 subrange(ranges::begin(r), ranges::end(r))
5) 从范围与大小提示构造 subrange 。若 n 不等于显式转换到其类型的 ranges::distance(ranges::begin(r), ranges::end(r)) 则行为未定义。

仅用于阐释的概念 different-from 为类型 TU 实现,当且仅当 std::decay_t<T>std::decay_t<U> 是不同的类型。

仅用于阐释的概念 convertible-to-non-slicingFromTo 满足或实现,当且仅当 std::convertible_to<From, To> 得到满足或实现,且任一下列条件得到满足:

参数

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

注解

仅用于阐释的概念 convertible-to-non-slicing 禁止从指向派生类的指针到指向基类的指针的转换。

缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 3470 C++20 convertible-to-non-slicing 曾拒绝一些合法的限定转换 使之接受
P2393R1 C++20 到整数类类型的隐式转换可能非法 使之为显式

示例