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 |
Value | 定义 |
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++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
LWG 1212 (N3066) |
C++98 | *i++ 的类型与 *i--(LegacyBidirectionalIterator 要求)的类型不匹配 |
将类型更改为 Ref 类型更改为 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 是前向迭代器,支持相等比较和多趟(概念) |
迭代器库 | 提供迭代器、迭代器特征、适配器和实用函数的定义 |