std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/; |
(1) | ((仅供说明*) |
辅助别名模板 |
||
template< class I > using /*iota-diff-t*/ = /* see below */; |
(2) | ((仅供说明*) |
辅助概念 |
||
template< class I > concept /*decrementable*/ = |
(3) | ((仅供说明*) |
template< class I > concept /*advanceable*/ = |
(4) | ((仅供说明*) |
- 如果
I
不是一个整型,或者它是一个整型并且sizeof(std::iter_difference_t<I>)大于sizeof(I),那么/*iota-diff-t*/<I>是std::iter_difference_t<I>. - 否则,/*iota-diff-t*/<I>是一个带符号整型,其宽度大于
I
的宽度(如果存在这样的类型)。 - 否则,
I
是其中一个最宽的整型,/*iota-diff-t*/<I>是一个未指定 带符号整型,其宽度不小于I
的宽度。是否/*iota-diff-t*/<I>在本例中模拟weakly_incrementable
是未指定的。
decrementable
又是totally_ordered
,并且在该类型及其不同类型之间operator+=、operator-=、operator+和operator-具有共同的含义。/*iterator*/ 模型
-
random_access_iterator
如果W模型advanceable
(4), -
bidirectional_iterator
如果W模型decrementable
(3), -
forward_iterator
如果W模型incrementable
,并且 -
input_iterator
否则。
但是,它只有在W
模型incrementable
时才满足LegacyInputIterator,否则不满足LegacyInputIterator。
[edit] 语义要求
I
模型decrementable
仅当I
满足decrementable
并且它包含的所有概念都已建模,以及给定类型I
的相等对象a和b- 如果a和b同时在预减和后减operator--的域中(即它们是可以递减的),那么以下所有内容都是true
- std::addressof(--a) == std::addressof(a),
- bool(a-- == b),
- bool(((void)a--, a) == --b),
- bool(++(--a) == b).
- 如果a和b同时在预增和后增operator++的域中(即它们是可以递增的),那么bool(--(++a) == b)是true。
D
表示/*iota-diff-t*/<I>。类型I
模型advanceable
仅当I
满足advanceable
并且它包含的所有概念都已建模,以及给定- 类型
I
的对象a和b以及 - 类型
D
的值n,
使得在对++a进行n次应用后,可以从a到达b,所有以下条件都得到满足
- (a += n)等于b.
- std::addressof(a += n)等于std::addressof(a).
- I(a + n)等于(a += n).
- 对于类型
D
的任意两个正值x和y,如果I(a + D(x + y))定义良好,那么I(a + D(x + y))等于I(I(a + x) + y). - I(a + D(0))等于a.
- 如果I(a + D(n - 1))定义良好,那么I(a + n)等于[](I c) { return ++c; }(I(a + D(n - 1))).
- (b += -n)等于a.
- (b -= n)等于a.
- std::addressof(b -= n)等于std::addressof(b).
- I(b - n)等于(b -= n).
- D(b - a)等于n.
- D(a - b) 等于 D(-n).
- bool(a <= b) 为 true.
[编辑] 嵌套类型
类型 | 定义 |
iterator_concept
|
一个 迭代器标签,见下文 |
iterator_category (仅当 W 符合 incrementable 且/*iota-diff-t*/<W> 为一个整型类型) |
std::input_iterator_tag |
value_type
|
W
|
difference_type
|
/*iota-diff-t*/<W> |
[编辑] 确定迭代器概念
iterator_concept
定义如下
- 如果
W
符合可前进
,iterator_concept
表示 std::random_access_iterator_tag. - 否则,如果
W
符合可后退
,iterator_concept
表示 std::bidirectional_iterator_tag. - 否则,如果
W
符合incrementable
,iterator_concept
表示 std::forward_iterator_tag. - 否则,
iterator_concept
表示 std::input_iterator_tag.
[编辑] 数据成员
成员 | 定义 |
W value_ |
当前值 (仅供说明目的的成员对象*) |
[编辑] 成员函数
std::ranges::iota_view::iterator::iterator
/*iterator*/() requires std::default_initializable<W> = default; |
(1) | (自 C++20) |
constexpr explicit /*iterator*/( W value ); |
(2) | (自 C++20) |
value_
。std::ranges::iota_view::iterator::operator*
constexpr W operator*() const noexcept(std::is_nothrow_copy_constructible_v<W>); |
(自 C++20) | |
返回 value_
.
示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6, 9).begin()}; const int& r = *it; // binds with temporary assert(*it == 6 and r == 6); ++it; assert(*it == 7 and r == 6); }
std::ranges::iota_view::iterator::operator++
constexpr /*iterator*/& operator++(); |
(1) | (自 C++20) |
constexpr void operator++(int); |
(2) | (自 C++20) |
constexpr /*iterator*/ operator++(int) requires std::incrementable<W>; |
(3) | (自 C++20) |
value_
; return *this;.value_
;.value_
; return tmp;.示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(8).begin()}; assert(*it == 8); assert(*++it == 9); assert(*it++ == 9); assert(*it == 10); }
std::ranges::iota_view::iterator::operator--
constexpr /*iterator*/& operator--() requires /*decrementable*/<W>; |
(1) | (自 C++20) |
constexpr /*iterator*/operator--(int) requires /*decrementable*/<W>; |
(2) | (自 C++20) |
value_
; return *this;.value_
; return tmp;.示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(8).begin()}; assert(*it == 8); assert(*--it == 7); assert(*it-- == 7); assert(*it == 6); }
std::ranges::iota_view::iterator::operator+=
constexpr /*iterator*/& operator+=( difference_type n ) requires /*advanceable*/<W>; |
(自 C++20) | |
更新 value_
并返回 *this
示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(5).begin()}; assert(*it == 5); assert(*(it += 3) == 8); }
std::ranges::iota_view::iterator::operator-=
constexpr /*iterator*/& operator-=( difference_type n ) requires /*advanceable*/<W>; |
(自 C++20) | |
更新 value_
并返回 *this
示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6).begin()}; assert(*it == 6); assert(*(it -= -3) == 9); }
std::ranges::iota_view::iterator::operator[]
constexpr W operator[]( difference_type n ) const requires /*advanceable*/<W>; |
(自 C++20) | |
返回 W(value_
+ n).
示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6).begin()}; assert(*it == 6); assert(*(it + 3) == 9); }
[编辑] 非成员函数
operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)
friend constexpr bool operator== ( const /*iterator*/& x, const /*iterator*/& y ) |
(1) | (自 C++20) |
friend constexpr bool operator< ( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (自 C++20) |
friend constexpr bool operator> ( const /*iterator*/& x, const /*iterator*/& y ) |
(3) | (自 C++20) |
friend constexpr bool operator<= ( const /*iterator*/& x, const /*iterator*/& y ) |
(4) | (自 C++20) |
friend constexpr bool operator>= ( const /*iterator*/& x, const /*iterator*/& y ) |
(5) | (自 C++20) |
friend constexpr bool operator<=> ( const /*iterator*/& x, const /*iterator*/& y ) |
(6) | (自 C++20) |
!=
运算符从 operator==
合成。
operator+(std::ranges::iota_view::iterator)
friend constexpr /*iterator*/ operator+ ( /*iterator*/ i, difference_type n ) |
(1) | (自 C++20) |
friend constexpr /*iterator*/ operator+ ( difference_type n, /*iterator*/ i ) |
(2) | (自 C++20) |
等价于 i += n; return i;.
operator-(std::ranges::iota_view::iterator)
friend constexpr /*iterator*/ operator- ( /*iterator*/ i, difference_type n ) |
(1) | (自 C++20) |
friend constexpr difference_type operator- ( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (自 C++20) |
D
为 difference_type
[编辑] 缺陷报告
以下行为更改缺陷报告被追溯地应用于之前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
P2259R1 | C++20 | 成员 iterator_category 始终被定义 |
仅在 W 满足 可递增 时被定义 |
LWG 3580 | C++20 | operator+ 和 operator- 的主体排除了 隐式移动 | 适合进行隐式移动 |