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 |
|
前条件 | i 和 j 都在 == 的定义域中。 | ||||
效果 | 等价于 !(i == j)。 | ||||||
*i | R ,可转换到 T
|
前条件 | i 可解引用。 | ||||
效果 |
| ||||||
i->m | 前条件 | i 可解引用。 | |||||
效果 | 等价于 (*i).m。 | ||||||
++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) |
指定类型为输入迭代器,即可读取其所引用的值,且可前/后自增 (概念) |
迭代器库 | 提供迭代器的定义、迭代器表征、适配器和工具函数 |