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 起) |
[edit] 注释
与 std::forward_iterator 概念不同,LegacyForwardIterator 要求解引用返回引用。
[edit] 缺陷报告
以下行为更改的缺陷报告被追溯应用到先前发布的 C++ 标准中。
DR | 应用于 | 已发布的行为 | 正确的行为 |
---|---|---|---|
LWG 1212 (N3066) |
C++98 | *i++ 的类型与 *i-- 的类型不匹配,这是 LegacyBidirectionalIterator 所要求的 |
将类型更改为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> 成为左值引用类型 |
也允许右值 引用类型 |
[edit] 另请参阅
(C++20) |
指定 input_iterator 是一个支持相等比较和多遍的正向迭代器(概念) |
迭代器库 | 提供迭代器、迭代器特性、适配器和实用函数的定义 |