C++ 命名要求: LegacyOutputIterator
一个 LegacyOutputIterator 是一个可以写入所指向元素的 LegacyIterator。
实现 LegacyOutputIterator 的一个类型示例是 std::ostream_iterator。
当 LegacyForwardIterator、LegacyBidirectionalIterator 或 LegacyRandomAccessIterator 除了自身要求之外还满足 LegacyOutputIterator 要求时,它被称为可变(mutable)。
要求
如果满足以下条件,类型 X 满足 LegacyOutputIterator:
- 类型 X 满足 LegacyIterator
- X 是类类型或指针类型
并且,给定
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++ = o | (未使用) | *r = o; |
备注
对输出迭代器使用 operator*
唯一有效的方式是在赋值语句的左侧:operator*
可以返回一个代理对象,该对象定义了一个成员 operator=
(它可能是一个模板)。
输出迭代器可能未定义相等和不等。即使定义了 operator==
,x == y
也无需意味着 ++x == ++y
。
通过同一个输出迭代器进行的赋值只发生一次:输出迭代器上的算法必须是单趟算法。
通过输出迭代器进行的赋值预计与递增交替进行。双重递增是未定义行为(C++ 标准目前声称支持双重递增,这与 STL 文档相悖;这是 LWG issue 2035)。
纯输出迭代器允许将其 iterator_traits<X>::value_type
、iterator_traits<X>::difference_type
、iterator_traits<X>::pointer
和 iterator_traits<X>::reference
声明为 void(并且像 std::back_insert_iterator 这样的迭代器正是这样做的 除了 difference_type,它现在定义为满足 std::output_iterator
(C++20 起))。
标准库
以下标准库迭代器是输出迭代器,但不是前向迭代器: