跳到主要内容

C++ 命名要求: LegacyInputIterator

LegacyInputIterator 是一个 LegacyIterator,可以从所指向的元素读取数据。LegacyInputIterator 只保证对单次遍历算法的有效性:一旦 LegacyInputIterator i 被递增,其所有先前值的副本都可能失效。

要求

如果满足以下条件,类型 It 则满足 LegacyInputIterator

并且,给定

  • ij,类型为 Itconst It 的值
  • r,类型为 It 的左值
  • reference,由 std::iterator_traits<It>::reference 表示的类型
  • value_type,由 std::iterator_traits<It>::value_type 表示的类型

以下表达式必须有效并具有其指定的效果

表达式返回类型等价表达式备注
i != j可转换为 bool!(i == j)前置条件:(i, j)== 的域中。
*ireference,可转换为 value_type如果 i == j(i, j)== 的域中,则这等同于 *j前置条件:i 是可解引用的。表达式 (void)*i, *i 等同于 *i
i->m(*i).m前置条件:i 是可解引用的。
++rIt&前置条件:r 是可解引用的。
后置条件:r 是可解引用的,或者 r 是 beyond-the-end。
后置条件:r 的先前值的任何副本不再需要是可解引用的或在 == 的域中。
(void)r++(void)++r
*r++可转换为 value_typevalue_type x = *r;
++r;
return x;

备注

"在 == 的域中" 表示两个迭代器值之间定义了相等比较。对于输入迭代器,不需要为所有值定义相等比较,并且 == 域中的值集可能会随时间变化。

对于不是 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>;
};

其中,仅用于说明的概念 __LegacyIteratorLegacyIterator#Concept 中描述。

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 98C++98*i++ 的返回类型是 value_type它可以是任何可转换为 value_type 的类型

C++ 命名要求: LegacyInputIterator

LegacyInputIterator 是一个 LegacyIterator,可以从所指向的元素读取数据。LegacyInputIterator 只保证对单次遍历算法的有效性:一旦 LegacyInputIterator i 被递增,其所有先前值的副本都可能失效。

要求

如果满足以下条件,类型 It 则满足 LegacyInputIterator

并且,给定

  • ij,类型为 Itconst It 的值
  • r,类型为 It 的左值
  • reference,由 std::iterator_traits<It>::reference 表示的类型
  • value_type,由 std::iterator_traits<It>::value_type 表示的类型

以下表达式必须有效并具有其指定的效果

表达式返回类型等价表达式备注
i != j可转换为 bool!(i == j)前置条件:(i, j)== 的域中。
*ireference,可转换为 value_type如果 i == j(i, j)== 的域中,则这等同于 *j前置条件:i 是可解引用的。表达式 (void)*i, *i 等同于 *i
i->m(*i).m前置条件:i 是可解引用的。
++rIt&前置条件:r 是可解引用的。
后置条件:r 是可解引用的,或者 r 是 beyond-the-end。
后置条件:r 的先前值的任何副本不再需要是可解引用的或在 == 的域中。
(void)r++(void)++r
*r++可转换为 value_typevalue_type x = *r;
++r;
return x;

备注

"在 == 的域中" 表示两个迭代器值之间定义了相等比较。对于输入迭代器,不需要为所有值定义相等比较,并且 == 域中的值集可能会随时间变化。

对于不是 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>;
};

其中,仅用于说明的概念 __LegacyIteratorLegacyIterator#Concept 中描述。

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 98C++98*i++ 的返回类型是 value_type它可以是任何可转换为 value_type 的类型