C++ 命名要求: LegacyInputIterator
LegacyInputIterator 是一个 LegacyIterator,可以从所指向的元素读取数据。LegacyInputIterator 只保证对单次遍历算法的有效性:一旦 LegacyInputIterator i
被递增,其所有先前值的副本都可能失效。
要求
如果满足以下条件,类型 It 则满足 LegacyInputIterator:
- 类型 It 满足 LegacyIterator
- 类型 It 满足 EqualityComparable
并且,给定
i
和j
,类型为 It 或 const It 的值r
,类型为 It 的左值reference
,由std::iterator_traits<It>::reference
表示的类型value_type
,由std::iterator_traits<It>::value_type
表示的类型
以下表达式必须有效并具有其指定的效果
表达式 | 返回类型 | 等价表达式 | 备注 |
---|---|---|---|
i != j | 可转换为 bool | !(i == j) | 前置条件:(i, j) 在 == 的域中。 |
*i | reference ,可转换为 value_type | 如果 i == j 且 (i, j) 在 == 的域中,则这等同于 *j 。 | 前置条件:i 是可解引用的。表达式 (void)*i, *i 等同于 *i 。 |
i->m | (*i).m | 前置条件:i 是可解引用的。 | |
++r | It& | 前置条件:r 是可解引用的。后置条件: r 是可解引用的,或者 r 是 beyond-the-end。后置条件: r 的先前值的任何副本不再需要是可解引用的或在 == 的域中。 | |
(void)r++ | (void)++r | ||
*r++ | 可转换为 value_type | value_type x = *r; |
备注
"在 == 的域中" 表示两个迭代器值之间定义了相等比较。对于输入迭代器,不需要为所有值定义相等比较,并且 == 域中的值集可能会随时间变化。
对于不是 LegacyForwardIterator 的输入迭代器的引用类型不必是引用类型:解引用输入迭代器可能会返回一个代理对象或按值返回 value_type
本身(如 std::istreambuf_iterator 的情况)。
概念 (自 C++20 起)
点击展开
对于 std::iterator_traits 的定义,定义了以下仅用于说明的概念。
template<class I>
concept __LegacyInputIterator =
__LegacyIterator<I> && std::equality_comparable<I> && requires(I i) {
typename std::incrementable_traits<I>::difference_type;
typename std::indirectly_readable_traits<I>::value_type;
typename std::common_reference_t<std::iter_reference_t<I>&&,
typename std::indirectly_readable_traits<I>::value_type&>;
*i++;
typename std::common_reference_t<decltype(*i++)&&,
typename std::indirectly_readable_traits<I>::value_type&>;
requires std::signed_integral<typename std::incrementable_traits<I>::difference_type>;
};
其中,仅用于说明的概念 __LegacyIterator
在 LegacyIterator#Concept 中描述。
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 98 | C++98 | *i++ 的返回类型是 value_type | 它可以是任何可转换为 value_type 的类型 |