Namespaces
Variants

C++ named requirements: LegacyInputIterator

From cppreference.net
C++ named requirements

一个 LegacyInputIterator 是能够读取所指元素的 LegacyIterator LegacyInputIterator 仅保证在单趟算法中有效:一旦 LegacyInputIterator i 被递增,其先前值的所有副本可能都会失效。

目录

要求

类型 定义
X 输入迭代器类型
T X 值类型 (即 std:: iterator_traits < X > :: value_type
R std:: iterator_traits < X > :: reference
定义
i , j 类型为 X const X 的值
r 类型为 X& 的值
其他 定义
m 可能表示数据成员或成员函数的标识符


X 满足 LegacyInputIterator 的条件是当且仅当满足以下所有要求:

表达式 类型 语义
i ! = j
满足 BooleanTestable 的类型 (C++20 前)
建模 boolean-testable 的类型 (C++20 起)
前置条件 i j == 定义域 内。
效果 等价于 ! ( i == j )
* i R ,可转换为 T 前置条件 i 可解引用 的。
效果
  • 表达式 ( void ) * i, * i 等价于 * i
  • i j == 的定义域内,且 i == j ,则 * i 等价于 * j
i - > m 前置条件 i 是可解引用的。
效果 等价于 ( * i ) . m
++ r X& 前置条件 r 是可解引用的。
后置条件
  • r 是可解引用的或 r 是尾后迭代器。
  • r 先前值的任何副本不再需要是可解引用的或在 == 的定义域内。
( void ) r ++ 效果 等价于 ( void ) ++ r
* r ++ 可转换为 T 效果 等价于 T x = * r ; ++ r ; return x ;

相等性域

术语 the domain of == 用于表示通常数学意义上的值域,即能够使用 == 进行比较的数值集合。该集合可能随时间变化。

每个算法对其使用的迭代器值的等价域提出了额外要求。这些要求可以从算法对 == ! = 运算符的使用方式推导得出。

注释

对于非 LegacyForwardIterator 的输入迭代器 X std:: iterator_traits < X > :: reference 不必是引用类型:解引用输入迭代器可能返回代理对象,或通过值返回 std:: iterator_traits < X > :: 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:: indirectly_readable_traits < I > :: value_type ;
typename std:: common_reference_t < std:: iter_reference_t < I > && ,
typename std:: indirectly_readable_traits < I > :: value_type & > ;
* i ++ ;
typename std:: common_reference_t < decltype ( * i ++ ) && ,
typename std:: indirectly_readable_traits < I > :: value_type & > ;
requires std:: signed_integral < typename std:: incrementable_traits < I > :: difference_type > ;

} ;

其中仅用于说明的概念 __LegacyIterator LegacyIterator 中有描述。

(自 C++20 起)

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 适用范围 发布时行为 正确行为
LWG 98 C++98 要求 * i ++ 的返回类型必须是 T 可以是任何可转换为 T 的类型
LWG 2114
( P2167R3 )
C++98 转换为 bool 的要求过于宽松,
无法反映实现预期
强化了相关要求

参见

指定某个类型为输入迭代器,即其引用值可被读取且支持前置与后置递增操作
(概念)
迭代器库 提供迭代器、迭代器特征、适配器及工具函数的定义