C++ 具名要求:老式输入迭代器 (LegacyInputIterator)
老式输入迭代器 (LegacyInputIterator) 是能从所指向元素进行读取的老式迭代器 (LegacyIterator) 。老式输入迭代器 (LegacyInputIterator) 只会保证单趟算法的有效性:一旦自增老式输入迭代器 (LegacyInputIterator) i,那么所有它之前的值的副本都可能会失效。
要求
类型 | 定义 |
X
|
输入迭代器类型 |
T
|
X 的值类型(即 std::iterator_traits<X>::value_type)
|
R
|
std::iterator_traits<X>::reference |
值 | 定义 |
i, j | X 或 const X 类型的值
|
r | X& 类型的值
|
其他 | 定义 |
m
|
标识符,可能指代数据成员或成员函数 |
在满足以下所有条件时,X
是老式输入迭代器 (LegacyInputIterator) :
-
X
满足老式迭代器 (LegacyIterator) -
X
满足可相等比较 (EqualityComparable) - 下列表达式必须合法,并且具有指定的效果:
表达式 | 类型 | 效果 | 条件 | |
---|---|---|---|---|
i != j | 符合可布尔测试 (BooleanTestable) 要求 (C++20 前) |
等价于 !(i == j)。 | 前条件 | i 和 j 都在 == 的定义域中。 |
实现 boolean-testable (C++20 起) |
后条件 | 无明确要求 | ||
*i | R ,可转换到 T
|
|
前条件 | i 可解引用。 |
后条件 | 无明确要求 | |||
i->m | 等价于 (*i).m。 | 前条件 | i 可解引用。 | |
后条件 | 无明确要求 | |||
++r | X&
|
前条件 | r 可解引用。 | |
后条件 |
| |||
(void)r++ | 等价于 (void)++r。 | 无明确要求 | ||
*r++ | 可转换到 T
|
等价于 T x = *r; ++r; return x;。 |
无明确要求 |
相等性定义域
术语 == 的定义域 在通常的数学逻辑下表示(要求)可以通过 ==进行比较的值的集合。该集合在不同的情况下可能会有所不同。
每个算法都会对它使用的迭代器值进行额外的相等性定义域要求。这些要求可以从算法对 == 和 != 的使用来推断。
注解
对于不是向前迭代器的输入迭代器 X
,std::iterator_traits<X>::reference 不一定是引用类型:解引用输入迭代器可以返回一个代理对象,或以值返回 std::iterator_traits<X>::value_type 本身(如 std::istreambuf_iterator 的情况)。
概念为了定义 std::iterator_traits,定义了以下仅用于阐述的概念:
其中仅用于阐述的概念 |
(C++20 起) |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 98 | C++98 | 要求 *i++ 的类型是 T
|
可以是任意可转换到 T 的类型
|
LWG 2114 (P2167R3) |
C++98 | 到 bool 的按语境可转换性过于弱而无法反映实现的期待 | 加强要求 |
参阅
(C++20) |
指定类型为输入迭代器,即可读取其所引用的值,且可前/后自增 (概念) |
迭代器库 | 提供迭代器的定义、迭代器表征、适配器和工具函数 |