std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/; | (1) | (仅用于阐述*) |
辅助别名模板 | ||
template< class I > using /*iota-diff-t*/ = /* 见下文 */; | (2) | (仅用于阐述*) |
辅助概念 | ||
template< class I > concept /*decrementable*/ = | (3) | (仅用于阐述*) |
template< class I > concept /*advanceable*/ = | (4) | (仅用于阐述*) |
- 如果
W
不是整数类型,或是整数类型且 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*/
- 在 W 实现
advanceable
时实现random_access_iterator
(4), - 在 W 实现
decrementable
时实现bidirectional_iterator
(3), - 在 W 实现
incrementable
时实现forward_iterator
, - 否则实现
input_iterator
。
然而,只有在 W
实现 incrementable
的情况下它才会满足老式输入迭代器 (LegacyInputIterator) ,否则不满足老式输入迭代器 (LegacyInputIterator) 。
语义要求
I
满足 decrementable
且所有它蕴含的概念均得到实现,并且给定相等的 I
类型对象 a 与 b,满足以下条件时,类型 I
才会实现 decrementable
: - 如果 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
只有在 I
满足 advanceable
且所有其所蕴含的概念均得到实现,并且给定 I
类型对象 a 与 b 及D
类型值 n,
使得 b 可在 n 次应用 ++a 后从 a 可达,使得下列所有条件都得到满足时才会实现 advanceable
:
- (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
实现了advanceable
,那么iterator_concept
表示 std::random_access_iterator_tag。 - 否则,如果
W
实现了decrementable
,那么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; // 绑定到临时量 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++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
P2259R1 | C++20 | 始终定义成员 iterator_category | 只有在 W 满足 incrementable 时才定义 |
LWG 3580 | C++20 | operator+ 与 operator- 复制迭代器 | 使之移动迭代器 |