Namespaces
Variants

C++ named requirements: LegacyForwardIterator

From cppreference.net
C++ named requirements

一个 LegacyForwardIterator 是一种 LegacyIterator ,能够从所指向的元素中读取数据。

LegacyInputIterator LegacyOutputIterator 不同,它可用于多趟算法。

若一个 LegacyForwardIterator it 源自某个 Container ,则该迭代器的值类型与容器相同,因此解引用操作( * it )将获得容器的值类型。

目录

要求

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

X 满足 LegacyForwardIterator 当且仅当满足以下所有条件:

  • X 满足 LegacyInputIterator 要求。
  • X 满足 DefaultConstructible 要求。
  • X 可变迭代器 ,则 Ref T 的引用类型。
  • X 为常量迭代器,则 Ref const T 的引用类型。
  • X 类型的对象提供 多趟遍历保证
  • i j 相等,则它们要么同时 可解引用 ,要么均不可解引用。
  • i j 均可解引用,则 i == j 当且仅当 * i * j 绑定至同一对象。
  • 下列表达式必须合法且具有指定语义:
表达式 类型 效果
r ++ 可转换为 const X & 等价于 X x = r ;
++ r ;
return x ;
* i ++ Ref

相等性域

前向迭代器的 定义域 是指向同一 底层序列 的迭代器集合。

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

换言之,值初始化的前向迭代器其行为如同指向同一空序列的末尾之后。

(since C++14)

多遍保证

类型 X 的两个可解引用迭代器 a b 满足 多遍保证 的条件是:当且仅当满足以下所有条件:

  • 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. a b 使用相同底层迭代器的情况下,对表达式 ++ a == ++ b 求值实际上会使底层容器递增两次,但结果仍为 true
  2. 形式上还要求蕴含 ++ b ! = a

参见

指定一个 input_iterator 为前向迭代器,支持相等比较和多遍遍历
(概念)
迭代器库 提供迭代器、迭代器特征、适配器及工具函数的定义