C++ 具名要求:老式向前迭代器 (LegacyForwardIterator)

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

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


 

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

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

要求

如果达成下列条件,那么类型 It 满足老式向前迭代器 (LegacyForwardIterator)

  • It 满足老式输出迭代器 (LegacyOutputIterator) (即 It 是可变迭代器类型)的情况下必须是 T&T&& (C++11 起)
  • 否则(即 It 是常迭代器类型)必须是 const T&const T&& (C++11 起)
(其中 Tstd::iterator_traits<It>::value_type 指代的类型)
  • 在同一底层序列上的所有迭代器和值初始化迭代器 (C++14 起)中定义等于和不等于比较。

而且,给定

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

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

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

多趟保证

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

  • 如果 ab 比较相等(a == b 可按语境转换成 true),那么要么都不可解引用,要么 *a*b 是绑定到同一对象的引用
  • 如果 *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 It>

concept __LegacyForwardIterator =
    __LegacyInputIterator<It> && std::constructible_from<It> &&
    std::is_reference_v<std::iter_reference_t<It>> &&
    std::same_as<
        std::remove_cvref_t<std::iter_reference_t<It>>,
        typename std::indirectly_readable_traits<It>::value_type> &&
    requires(It it) {
        {  it++ } -> std::convertible_to<const It&>;
        { *it++ } -> std::same_as<std::iter_reference_t<It>>;

    };

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

(C++20 起)

缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 1212
(N3066)
C++98 *i++ 的返回类型与老式双向迭代器 (LegacyBidirectionalIterator)
要求的 *i-- 的返回类型不匹配
将返回类型改为 reference
LWG 1311
(N3066)
C++98 a == b 蕴含 ++a == ++b”不足以提供多趟保证[1] 也要求“a == b 蕴含 ++a != b[2]
LWG 3798 C++20 __LegacyForwardIterator 要求
std::iter_reference_t<It> 是左值引用类型
也允许右值引用类型
  1. 例如在 ab 使用相同的底层迭代器的情况下,对表达式 ++a == ++b 进行求值会将底层迭代器自增两次,但求值结果依然是 true
  2. 正式而言也要求蕴含 ++b != a

参阅

指定 input_iterator 为向前迭代器,支持相等比较与多趟操作
(概念)
迭代器库 提供迭代器的定义、迭代器表征、适配器和工具函数