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

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

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

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

如果某个老式向前迭代器 (LegacyForwardIterator) it 源自某个容器 (Container) ,那么 it 与该容器具有相同的值类型,因此解引用 (*it) 将获得该容器的值类型。

要求

类型 定义
X 向前迭代器类型
T X值类型(即 std::iterator_traits<X>::value_type
Ref std::iterator_traits<X>::reference
定义
i, j Xconst X 类型的值
r X& 类型的值

在满足以下所有条件时,X老式向前迭代器 (LegacyForwardIterator)

 表达式  类型 效果
r++ 可转换到 const X&  等价于 X x = r;
++r;
return x;
*i++ Ref

相等性定义域

对于向前迭代器,==定义域是具有相同的底层序列的迭代器。

值初始化的向前迭代器也可以用来比较,而且必须与相同类型的其他值初始化的迭代器比较相等。

也就是说,值初始化的向前迭代器如同是指代相同的空序列的尾后位置的迭代器。

(C++14 起)

多趟保证

X 类型的两个可解引用的迭代器 ab 在满足以下所有条件时提供多趟保证

  • a == b 意味着 ++a == ++b
  • 满足以下任意条件:
  • X 是指针类型。
  • 表达式 (void)++X(a), *a 等价于表达式 *a


概念

为了定义 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 起)

注解

std::forward_iterator 概念不同,老式向前迭代器 (LegacyForwardIterator) 要求解引用需要返回引用。

缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 1212
(N3066)
C++98 *i++ 的类型与老式双向迭代器 (LegacyBidirectionalIterator)
要求的 *i-- 的类型不匹配
将类型改为 Ref
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 为向前迭代器,支持相等比较与多趟操作
(概念)
迭代器库 提供迭代器的定义、迭代器表征、适配器和工具函数