命名空间
变体
操作

C++ 命名要求: LegacyInputIterator

来自 cppreference.com
 
 
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;
.
没有明确的要求

[编辑] 相等域

术语== 的域 在通常的数学意义上用来表示可以用 == 进行比较的值集。此集合可能会随着时间的推移而改变。

每个算法都对它使用的迭代器值的相等域提出了额外的要求。这些要求可以从算法对 ==!= 的使用推断出来。

[编辑] 说明

对于不是 LegacyForwardIterator 的输入迭代器 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>;

};

where the exposition-only concept __LegacyIterator is described in LegacyIterator.

(自 C++20)

[edit] 缺陷报告

以下行为变更缺陷报告被追溯应用于之前发布的 C++ 标准。

DR 应用于 发布的行为 正确行为
LWG 98 C++98 *i++ 的返回类型要求为 T 它可以是任何可转换为 T 的类型
LWG 2114
(P2167R3)
C++98 可转换为 bool 太弱,无法反映实现的期望 要求得到加强

[edit] 参见

指定一个类型是输入迭代器,即它的引用值可以被读取,并且可以进行前缀和后缀递增
(概念) [edit]
迭代器库 提供迭代器、迭代器特征、适配器和实用函数的定义