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) | ( 仅用于说明* ) |
iterator
是由
ranges::
iota_view
<
W, Bound
>
的
begin()
和
end()
返回的迭代器类型。
-
若
I不是整型类型,或其为整型类型但 sizeof ( std:: iter_difference_t < I > ) 大于 sizeof ( I ) ,则 /*iota-diff-t*/ < I > 为 std:: iter_difference_t < I > 。 -
否则,若存在宽度大于
I的有符号整数类型,则 /*iota-diff-t*/ < I > 为该类型。 -
否则,
I为最宽整型类型之一,此时 /*iota-diff-t*/ < I > 为宽度不小于I的未指定 有符号整数式类型 。在此情况下,未指定 /*iota-diff-t*/ < I > 是否满足weakly_incrementable概念。
可递减
与
全序
要求,且该类型与相异类型间的
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
满足
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 ,
使得 b 可从 a 经过 n 次 ++ 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
概念且
/*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) | (since C++20) |
|
constexpr
explicit
/*iterator*/
(
W value
)
;
|
(2) | (since C++20) |
value_
。
std::ranges::iota_view:: iterator :: operator*
|
constexpr
W operator
*
(
)
const
noexcept ( std:: is_nothrow_copy_constructible_v < W > ) ; |
(since 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) | (since C++20) |
|
constexpr
void
operator
++
(
int
)
;
|
(2) | (since C++20) |
|
constexpr
/*iterator*/
operator
++
(
int
)
requires
std::
incrementable
<
W
>
;
|
(3) | (since 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) | (since C++20) |
|
constexpr
/*iterator*/
operator
--
(
int
)
requires
/*decrementable*/
<
W
>
;
|
(2) | (since 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 > ; |
(since 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 > ; |
(since 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 > ; |
(since 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) | (since C++20) |
|
friend
constexpr
bool
operator
<
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(2) | (since C++20) |
|
friend
constexpr
bool
operator
>
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(3) | (since C++20) |
|
friend
constexpr
bool
operator
<=
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(4) | (since C++20) |
|
friend
constexpr
bool
operator
>=
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(5) | (since C++20) |
|
friend
constexpr
bool
operator
<=>
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(6) | (since C++20) |
!=
运算符由
operator==
合成
。
这些函数对普通的 非限定 或 限定查找 不可见,仅当 iterator 是参数的关联类时,才能通过 实参依赖查找 找到。
operator+ (std::ranges::iota_view:: iterator )
|
friend
constexpr
/*iterator*/
operator
+
(
/*iterator*/
i, difference_type n
)
|
(1) | (since C++20) |
|
friend
constexpr
/*iterator*/
operator
+
(
difference_type n,
/*iterator*/
i
)
|
(2) | (since C++20) |
等价于 i + = n ; return i ; 。
这些函数对普通的 非限定查找 或 限定查找 不可见,仅当 iterator 作为参数的关联类时,通过 实参依赖查找 才能找到。
operator- (std::ranges::iota_view:: iterator )
|
friend
constexpr
/*iterator*/
operator
-
(
/*iterator*/
i, difference_type n
)
|
(1) | (since C++20) |
|
friend
constexpr
difference_type operator
-
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(2) | (since C++20) |
D
为
difference_type
:
这些函数对普通的 无限定 或 有限定查找 不可见,只有当 iterator 是实参的关联类时,才能通过 实参依赖查找 找到。
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 正确行为 |
|---|---|---|---|
| P2259R1 | C++20 |
成员
iterator_category
始终被定义
|
仅当
W
满足
incrementable
时定义
|
| LWG 3580 | C++20 | operator + 和 operator - 的函数体排除了 隐式移动 | 调整为支持隐式移动 |