C++ 具名要求:老式输入迭代器 (LegacyInputIterator)

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

老式输入迭代器 (LegacyInputIterator) 是能从所指向元素进行读取的老式迭代器 (LegacyIterator) 老式输入迭代器 (LegacyInputIterator) 只会保证单趟算法的有效性:一旦自增老式输入迭代器 (LegacyInputIterator) i,那么所有它之前的值的副本都可能会失效。

要求

类型 定义
X 输入迭代器类型
T X值类型(即 std::iterator_traits<X>::value_type
R std::iterator_traits<X>::reference
定义
i, j Xconst X 类型的值
r X& 类型的值
其他 定义
m 标识符,可能指代数据成员或成员函数

在满足以下所有条件时,X老式输入迭代器 (LegacyInputIterator)

表达式 类型 效果 条件
i != j 符合可布尔测试 (BooleanTestable) 要求
(C++20 前)
等价于 !(i == j) 前条件 ij 都在 ==定义域中。
实现 boolean-testable
(C++20 起)
后条件 无明确要求
*i R,可转换到 T
  • 表达式 (void)*i, *i 等价于 *i
  • 如果 ij 都在 == 的定义域中,并且 i == j,那么 *i 等价于 *j
前条件 i 可解引用
后条件 无明确要求
i->m 等价于 (*i).m 前条件 i 可解引用。
后条件 无明确要求
++r X& 前条件 r 可解引用。
          
后条件
          
  • r 可解引用或 r 是尾后迭代器。
  • r 先前的值的所有副本都不再需要可解引用或在 == 的定义域中。
(void)r++ 等价于 (void)++r 无明确要求
*r++ 可转换到 T 等价于 T x = *r;
++r;
return x;
无明确要求

相等性定义域

术语 == 的定义域 在通常的数学逻辑下表示(要求)可以通过 ==进行比较的值的集合。该集合在不同的情况下可能会有所不同。

每个算法都会对它使用的迭代器值进行额外的相等性定义域要求。这些要求可以从算法对 ==!= 的使用来推断。

注解

对于不是向前迭代器的输入迭代器 Xstd::iterator_traits<X>::reference 不一定是引用类型:解引用输入迭代器可以返回一个代理对象,或以值返回 std::iterator_traits<X>::value_type 本身(如 std::istreambuf_iterator 的情况)。

概念

为了定义 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 描述。

(C++20 起)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 98 C++98 要求 *i++ 的类型是 T 可以是任意可转换到 T 的类型
LWG 2114
(P2167R3)
C++98 bool 的按语境可转换性过于弱而无法反映实现的期待 加强要求

参阅

指定类型为输入迭代器,即可读取其所引用的值,且可前/后自增
(概念)
迭代器库 提供迭代器的定义、迭代器表征、适配器和工具函数