C++ 具名要求:遗留输出迭代器 (LegacyOutputIterator)

< cpp‎ | named req
 
 
 

遗留输出迭代器 (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 这样的迭代器正如此)。

标准库

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

参阅

指定类型为给定的值类型的输出迭代器,即可向其写入该类型的值,且可前/后自增
(概念)