C++ 具名要求:老式向前迭代器(LegacyForwardIterator)
老式向前迭代器(LegacyForwardIterator) 是能从所指向的元素读取数据的老式迭代器(LegacyIterator) 。
与老式输入迭代器(LegacyInputIterator) 和老式输出迭代器(LegacyOutputIterator) 不同,它可被用于多趟算法。
如果某个老式向前迭代器(LegacyForwardIterator) it 源自某个容器(Container) ,那么 it 与该容器具有相同的值类型,因此解引用 (*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 都绑定到相同的对象时 i == j。
- 下列表达式必须合法,并且具有指定的效果:
表达式 | 类型 | 效果 |
---|---|---|
r++ | 可转换到 const X& | 等价于 X x = r; ++r; return x;。 |
*i++ | Ref |
[编辑]相等性定义域
对于向前迭代器,== 的定义域是具有相同的底层序列的迭代器。
值初始化的向前迭代器也可以用来比较,而且必须与相同类型的其他值初始化的迭代器比较相等。 也就是说,值初始化的向前迭代器如同是指代相同的空序列的尾后位置的迭代器。 | (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 为向前迭代器,支持相等比较与多趟操作 (概念) |
迭代器库 | 提供迭代器的定义、迭代器表征、适配器和工具函数 |