C++ 具名要求:老式输出迭代器 (LegacyOutputIterator)

来自cppreference.com
< cpp‎ | named req
 
 
C++ 具名要求
基础
类型属性
库所属
容器
容器元素
迭代器
流 I/O
随机数
并发
(C++11)
(C++11)
其他
 

老式输出迭代器 (LegacyOutputIterator) 是能写入所指向元素的老式迭代器 (LegacyIterator)

一个实现老式输出迭代器 (LegacyOutputIterator) 的类型的例子是 std::ostream_iterator

老式向前迭代器 (LegacyForwardIterator) 老式双向迭代器 (LegacyBidirectionalIterator) 老式随机访问迭代器 (LegacyRandomAccessIterator) 在自身的要求之外还满足老式输出迭代器 (LegacyOutputIterator) 的要求时,它即被描述为可变的(mutable)

要求

以下情况下,类型 X 满足老式输出迭代器 (LegacyOutputIterator)

且,给定

  • o,是输出迭代器对应的可写入类型的值(可以有多种可写入的类型,例如 operator= 是模板的情况。并没有像输入迭代器的 value_type 那种记号)
  • r,为 X 类型的左值,

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

表达式 返回 等价表达式 前条件 后条件 注解
*r = o (不使用) r 可解引用 r 可自增 在此操作后不要求 r 可解引用,且不再要求任何 r 的先前值的副本可解引用或可自增。
++r X& r 可自增 r++r 指代同一迭代器对象,r 可解引用或为末尾后迭代器 在此操作后不要求 r 可自增,且不再要求任何 r 的先前值的副本可解引用或可自增。
r++ 可转换到 const X& X temp = r;

++r;
return temp;

*r++ = o (不使用) *r = o;

++r;

注解

operator* 对于输出迭代器的仅有的合法用法是在赋值的左侧:operator* 可以返回一个代理对象,它定义了成员 operator=(可以是模板)

可以不对输出迭代器定义相等和不相等。即使定义了 operator==x == y 也不需要隐含 ++x == ++y

通过输出迭代器的同一值进行的赋值只会发生一次:输出迭代器上的算法必须是单趟算法。

预期通过输出迭代器的赋值与自增交替进行。双重自增是未定义行为(C++ 标准当前声称双重自增得到支持,这与 STL 文档相反;此为 LWG2035

允许纯粹仅支持输出的迭代器声明其 iterator_traits<X>::value_typeiterator_traits<X>::difference_typeiterator_traits<X>::pointeriterator_traits<X>::referencevoid(如 std::back_insert_iterator 这样的迭代器正如此)。

标准库

下列的标准库迭代器是输出迭代器而非向前迭代器:

参阅

指定类型为给定的值类型的输出迭代器,即可向其写入该类型的值,且可前/后自增
(概念)
迭代器库 提供迭代器的定义、迭代器表征、适配器及工具函数