std::ranges::subrange<I,S,K>::subrange
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 ) |
(3) | (C++20 起) |
template< /*different-from*/<subrange> R > requires ranges::borrowed_range<R> && |
(4) | (C++20 起) |
template< ranges::borrowed_range R> requires /*convertible-to-non-slicing*/<ranges::iterator_t<R>, I> && |
(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-size
为 true ,否则为 false 。
subrange
。分别以 std::move(i) 与 s
初始化存储的迭代器与哨位。若 [i, s)
不是合法范围则行为未定义。subrange
。分别以 std::move(i) 与 s
初始化存储的迭代器与哨位。若存储大小,则以 n
初始化它。若 [i, s)
不是合法范围,或 n
不等于显式转换到其类型的 ranges::distance(i, s) 则行为未定义。subrange
。若存储大小则等价于 subrange(r, static_cast</*make-unsigned-like-t*/<std::iter_difference_t<I>>>(ranges::size(r))) 。否则等价于 subrange(ranges::begin(r), ranges::end(r)) 。仅用于阐释的概念 different-from
为类型 T
与 U
实现,当且仅当 std::decay_t<T> 与 std::decay_t<U> 是不同的类型。
仅用于阐释的概念 convertible-to-non-slicing
为 From
与 To
满足或实现,当且仅当 std::convertible_to<From, To> 得到满足或实现,且任一下列条件得到满足:
- std::decay_t<From> 或 std::decay_t<To> 不是指针类型、
- std::remove_pointer_t<From>(*)[] 可隐式转换为 std::remove_pointer_t<To>(*)[] ,即从
From
到To
的转换至多为限定转换。
参数
i | - | 代表范围起始的迭代器 |
s | - | 代表范围末尾的哨位 |
r | - | 范围 |
n | - | 大小提示,必须等于范围大小 |
注解
仅用于阐释的概念 convertible-to-non-slicing
禁止从指向派生类的指针到指向基类的指针的转换。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 3470 | C++20 | convertible-to-non-slicing 曾拒绝一些合法的限定转换
|
使之接受 |
P2393R1 | C++20 | 到整数类类型的隐式转换可能非法 | 使之为显式 |
示例
本节未完成 原因:暂无示例 |