C++ named requirements: LegacyForwardIterator
一个 LegacyForwardIterator 是一种 LegacyIterator ,能够从所指向的元素中读取数据。
与 LegacyInputIterator 和 LegacyOutputIterator 不同,它可用于多趟算法。
若一个 LegacyForwardIterator it 源自某个 Container ,则该迭代器的值类型与容器相同,因此解引用操作( * it )将获得容器的值类型。
目录 |
要求
| 类型 | 定义 |
X
|
前向迭代器类型 |
T
|
X
的
值类型
(即
std::
iterator_traits
<
X
>
::
value_type
)
|
Ref
|
std:: iterator_traits < X > :: reference |
| 值 | 定义 |
| i , j |
类型为
X
或
const
X
的值
|
| r |
类型为
X&
的值
|
X
满足
LegacyForwardIterator
当且仅当满足以下所有条件:
-
X满足 LegacyInputIterator 要求。 -
X满足 DefaultConstructible 要求。 -
若
X为 可变迭代器 ,则Ref是T的引用类型。 -
若
X为常量迭代器,则Ref是 const T 的引用类型。 -
X类型的对象提供 多趟遍历保证 。 - 若 i 与 j 相等,则它们要么同时 可解引用 ,要么均不可解引用。
- 若 i 与 j 均可解引用,则 i == j 当且仅当 * i 与 * j 绑定至同一对象。
- 下列表达式必须合法且具有指定语义:
| 表达式 | 类型 | 效果 |
|---|---|---|
| r ++ | 可转换为 const X & |
等价于
X x
=
r
;
++ r ; return x ; 。 |
| * i ++ |
Ref
|
相等性域
|
然而, 值初始化 的前向迭代器可以进行比较,且必须与同类型的其他值初始化迭代器相等。 换言之,值初始化的前向迭代器其行为如同指向同一空序列的末尾之后。 |
(since C++14) |
多遍保证
类型
X
的两个可解引用迭代器
a
和
b
满足
多遍保证
的条件是:当且仅当满足以下所有条件:
- a == b 意味着 ++ a == ++ b 。
- 满足以下任意条件:
-
-
X是指针类型。 - 表达式 ( void ) ++ X ( a ) , * a 等价于表达式 * a 。
-
概念为定义 std::iterator_traits ,特定义以下仅用于阐述的概念。
其中仅用于阐述的概念
|
(C++20 起) |
注释
与 std::forward_iterator 概念不同, LegacyForwardIterator 要求解引用操作必须返回引用类型。
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 修正后行为 |
|---|---|---|---|
|
LWG 1212
( N3066 ) |
C++98 |
*
i
++
的类型与
LegacyBidirectionalIterator 要求的 * i -- 类型不匹配 |
将类型改为
Ref
|
|
LWG 1311
( N3066 ) |
C++98 |
仅凭 "a
==
b 意味着
++
a
==
++
b"
无法提供多遍遍历保证 [1] |
同时要求 "a
==
b
意味着 ++ a ! = b" [2] |
| LWG 3798 | C++20 |
__LegacyForwardIterator
要求
std:: iter_reference_t < It > 为左值引用类型 |
同时允许右值
引用类型 |
参见
|
(C++20)
|
指定一个
input_iterator
为前向迭代器,支持相等比较和多遍遍历
(概念) |
| 迭代器库 | 提供迭代器、迭代器特征、适配器及工具函数的定义 |