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 的定义,定义了以下仅用于说明的概念。
其中,仅用于展示的 concept |
(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 是前向迭代器,支持相等比较和多趟遍历(concept) |
迭代器库 | 为迭代器、迭代器特性、适配器和实用函数提供定义 |