C++ 具名要求: LegacyForwardIterator

来自cppreference.com
< cpp‎ | named req
 
 
 

遗留向前迭代器 (LegacyForwardIterator) 是能从所指向的元素读取数据的遗留迭代器 (LegacyIterator)

不同于遗留输入迭代器 (LegacyInputIterator) 遗留输出迭代器 (LegacyOutputIterator) ,它可被用于多趟算法。

要求

若达成下列条件,则类型 It 满足遗留向前迭代器 (LegacyForwardIterator)

(其中 Tstd::iterator_traits<It>::value_type 所指代的类型)
  • 在同一底层序列上的所有迭代器和值初始化迭代器 (C++14 起)中定义等于和不等于比较。

而且,给定

  • i,为 It 类型的可解引用迭代器
  • reference,为 std::iterator_traits<It>::reference 所指代的类型

则下列表达式必须合法且拥有其指定的效果

表达式 返回类型 等价表达式 注意
i++ It It ip=i; ++i; return ip;
*i++ reference

可变的(mutable)遗留向前迭代器 (LegacyForwardIterator) 是还额外满足遗留输出迭代器 (LegacyOutputIterator) 要求的遗留向前迭代器 (LegacyForwardIterator)

多趟保证

给定 It 类型的可解引用迭代器 ab

  • ab 比较相等(a == b 可按语境转换为 true),则要么都不可解引用,要么 *a*b 是绑定到同一对象的引用
  • *a*b 指代相同的对象,则
  • 通过可变ForwardIterator进行赋值不会使迭代器失效(隐含地因为 reference 定义为真引用)
  • 自增 a 的副本不改变从 a 读取的值(正式而言,要么 It 是原生指针类型,要么表达式 (void)++It(a), *a 等价于表达式 *a
  • a == b 蕴含 ++a == ++b

孤立迭代器

值初始化遗留向前迭代器 (LegacyForwardIterator) 表现类似某个未指定空容器的末尾后迭代器:它与所有值初始化的同类型遗留向前迭代器 (LegacyForwardIterator) 比较为相等。

(C++14 起)

概念

为了定义 std::iterator_traits,定义了以下仅用于阐释的概念:

template<class I>

concept __LegacyForwardIterator =
  __LegacyInputIterator<I> && std::constructible_from<I> &&
  std::is_lvalue_reference_v<std::iter_reference_t<I>> &&
  std::same_as<
    std::remove_cvref_t<std::iter_reference_t<I>>,
    typename std::readable_traits<I>::value_type> &&
  requires(I i) {
    {  i++ } -> std::convertible_to<const I&>;
    { *i++ } -> std::same_as<std::iter_reference_t<I>>;

  };

其中仅用于阐释的概念 __LegacyInputIterator<T> 描述于 LegacyInputIterator#概念

(C++20 起)

参阅

指定 InputIterator 为向前迭代器,支持相等比较和多趟
(概念)