C++ 具名要求:老式向前迭代器 (LegacyForwardIterator)
老式向前迭代器 (LegacyForwardIterator) 是能从所指向的元素读取数据的老式迭代器 (LegacyIterator) 。
不同于老式输入迭代器 (LegacyInputIterator) 和老式输出迭代器 (LegacyOutputIterator) ,它可被用于多趟算法。
要求
如果达成下列条件,那么类型 It
满足老式向前迭代器 (LegacyForwardIterator) :
- 类型
It
满足老式输入迭代器 (LegacyInputIterator) - 类型
It
满足可默认构造 (DefaultConstructible) - 类型
It
的对象提供下文所述的多趟保证 - 设
T
为It
的值类型。类型 std::iterator_traits<It>::reference:
- 在
It
满足老式输出迭代器 (LegacyOutputIterator) (即It
是可变迭代器类型)的情况下必须是 T& 或T&&
(C++11 起), - 否则(即
It
是常迭代器类型)必须是 const T& 或 const T&& (C++11 起),
- 在
- (其中
T
是 std::iterator_traits<It>::value_type 指代的类型)
- 在同一底层序列上的所有迭代器和值初始化迭代器 (C++14 起)中定义等于和不等于比较。
而且,给定
-
It
类型的可解引用迭代器 i - std::iterator_traits<It>::reference 指代的类型
reference
下列表达式必须合法且拥有指定的效果:
表达式 | 返回类型 | 等价表达式 | 注意 |
---|---|---|---|
i++ | It |
It ip = i; ++i; return ip; | |
*i++ | reference |
可变(mutable)老式向前迭代器 (LegacyForwardIterator) 是还额外满足老式输出迭代器 (LegacyOutputIterator) 要求的老式向前迭代器 (LegacyForwardIterator) 。
多趟保证
给定 It
类型的可解引用迭代器 a 和 b:
- 如果 a 与 b 比较相等(a == b 可按语境转换成 true),那么要么都不可解引用,要么 *a 与 *b 是绑定到同一对象的引用
- 如果 *a 与 *b 指代相同的对象,那么 a == b。
- 通过可变
ForwardIterator
进行赋值不会使迭代器失效(隐含地因为reference
定义为真引用) - 自增 a 的副本不改变从 a 读取的值(正式而言,要么
It
是原生指针类型,要么表达式 (void)++It(a), *a 等价于表达式 *a) - a == b 蕴含 ++a == ++b
孤立迭代器值初始化的老式向前迭代器 (LegacyForwardIterator) 表现类似某个未指定空容器的末尾后迭代器:它与所有值初始化的同类型老式向前迭代器 (LegacyForwardIterator) 比较为相等。 |
(C++14 起) |
概念为了定义 std::iterator_traits,定义了以下仅用于阐释的概念:
其中仅用于阐述的概念 |
(C++20 起) |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 1212 (N3066) |
C++98 | *i++ 的返回类型与老式双向迭代器 (LegacyBidirectionalIterator) 要求的 *i-- 的返回类型不匹配 |
将返回类型改为 reference
|
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 为向前迭代器,支持相等比较与多趟操作 (概念) |
迭代器库 | 提供迭代器的定义、迭代器表征、适配器和工具函数 |