std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/; |
(1) | (C++20 起) (仅用于阐述*) |
| 辅助别名模板 |
||
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 实现 advanceable 仅若 I 满足 advanceable 且所有其所蕴含的概念均得到实现,并且给定
-
I类型对象a与b及 -
D类型值n,
使得 b 可在 n 次应用 ++a 后从 a 可达,下列所有条件都得到满足:
- (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 则为 std::input_iterator_tag。否则无成员类型 iterator_category。
|
value_type
|
W
|
difference_type
|
/*iota-diff-t*/<W> |
数据成员
| 成员名 | 定义 |
value_ (私有)
|
用于解引用的 W 类型的值。(仅用于阐述的成员对象*) |
成员函数
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_。value 初始化数据成员 value_。此值将由 operator* 返回,并通过 operator++ 增加。
std::ranges::iota_view::iterator::operator*
| constexpr W operator*() const noexcept(std::is_nothrow_copy_constructible_v<W>); |
(C++20 起) | |
按值返回当前值的副本(换言之,这是只读视图)。
示例
#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 起) |
示例
#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 起) |
示例
#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 起) | |
若 W 为无符号整数式类型,则在 n 非负时进行 value_ += static_cast<W>(n),否则进行 value -= static_cast<W>(-n),然后返回 *this。
否则等价于 value_ += n; return *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 起) | |
若 W 为无符号整数式类型,则在 n 非负时进行 value_ -= static_cast<W>(n),否则进行 value += static_cast<W>(-n),然后返回 *this。
否则等价于 value_ -= n; return *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 起) | |
等价于 return 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 ) requires std::equality_comparable<W>; |
(1) | (C++20 起) |
| friend constexpr bool operator< ( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W>; |
(2) | (C++20 起) |
| friend constexpr bool operator> ( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W>; |
(3) | (C++20 起) |
| friend constexpr bool operator<= ( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W>; |
(4) | (C++20 起) |
| friend constexpr bool operator>= ( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W>; |
(5) | (C++20 起) |
| friend constexpr bool operator<=>( const /*iterator*/& x, const /*iterator*/& y ) requires std::totally_ordered<W> && std::three_way_comparable<W>; |
(6) | (C++20 起) |
!= 运算符从 operator== 运算符合成。
operator+(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator+( /*iterator*/ i, difference_type n ) requires /*advanceable*/<W>; |
(1) | (C++20 起) |
| friend constexpr /*iterator*/ operator+( difference_type n, /*iterator*/ i ) requires /*advanceable*/<W>; |
(2) | (C++20 起) |
等价于 i += n; return i;。
operator-(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator-( /*iterator*/ i, difference_type n ) requires /*advanceable*/<W>; |
(1) | (C++20 起) |
| friend constexpr difference_type operator-( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (C++20 起) |
D 为 difference_type。
- 若
W为有符号整数式类型,等价于 return D(D(x.value_) - D(y.value_));。 - 否则若
W为无符号整数式类型,等价于 return y.value_ > x.value_ ? D(-D(y.value_ - x.value_)) : D(x.value_ - y.value_);。 - 否则等价于 return x.value_ - y.value_;。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| P2259R1 | C++20 | 始终定义成员 iterator_category
|
仅若 W 满足 incrementable 才定义
|
| LWG 3580 | C++20 | operator+ 与 operator- 复制迭代器
|
使之移动迭代器 |