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

来自cppreference.com
< cpp‎ | named req
 
 
C++ 具名要求
基础
类型属性
库所属
容器
容器元素
(C++11)

迭代器
LegacyInputIterator
流 I/O
格式化
(C++20)
随机数
(C++11)    
并发
(C++11)
(C++11)
范围
其他
(C++11)


 

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

要求

如果满足下列条件,那么类型 It 满足老式输入迭代器 (LegacyInputIterator)

并且,给定

那么下列表达式必须合法且拥有它指定的效果

表达式 返回类型 等价表达式 注解
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 可解引用。
++i It&

前条件i 可解引用

后条件i 可解引用或 i 是末尾后迭代器。

后条件:不再要求任何 i 的先前值的副本是可解引用的,或在 == 的定义域内。

(void)i++ (void)++i
*i++ 可转换到 value_type value_type x = *i;

++i;

return x;

注解

“在 == 的定义域内”的意思是,两个迭代器值之间定义了相等比较。对于输入迭代器,相等比较不需要对所有值定义,且 == 的定义域中的值的集合可能随时间而改变。

对于并非同时为老式向前迭代器 (LegacyForwardIterator) 的输入迭代器,其 reference 类型不必是引用类型:解引用输入迭代器可以返回一个代理对象,或以值返回 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::readable_traits<I>::value_type;
    typename std::common_reference_t<std::iter_reference_t<I>&&,
                                     typename std::readable_traits<I>::value_type&>;
    *i++;
    typename std::common_reference_t<decltype(*i++)&&,
                                     typename std::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++ 的返回类型是 value_type 可以是任意可转换到 value_type 的类型

参阅

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