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

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

老式输出迭代器 (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 的先前值的副本可解引用或可自增。
++rX&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 这样的迭代器正是如此)。

标准库

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

写入 std::basic_ostream 的输出迭代器
(类模板)
写入 std::basic_streambuf 的输出迭代器
(类模板)
插入到容器的迭代器适配器
(类模板)
在容器尾部插入的迭代器适配器
(类模板)
在容器头部插入的迭代器适配器
(类模板)

参阅

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