STL не предоставляет такого итератора. Но вы могли бы написать это самостоятельно (проверили этот код):
struct null_output_iterator :
std::iterator< std::output_iterator_tag,
null_output_iterator > {
/* no-op assignment */
template<typename T>
void operator=(T const&) { }
null_output_iterator & operator++() {
return *this;
}
null_output_iterator operator++(int) {
return *this;
}
null_output_iterator & operator*() { return *this; }
};
Ему не нужны никакие данные, используя себя как результат operator*
. Результат *it = x;
не используется в требованиях итератора вывода, поэтому мы можем присвоить ему тип возврата void
.
Редактировать: Давайте рассмотрим, как работает operator*
. Стандарт говорит в 24.1.2 / 1 о требованиях итератора вывода, которые в обоих этих случаях:
*it = t;
*it++ = t;
что результат этих выражений не используется. Вот что делает эту работу:
null_output_iterator it;
*it; // returns a null_output_iterator& per definition of the `operator*`.
*it = some_value; // returns void per definition of the templated `operator=`.
Теперь нам не нужны данные, которые мы возвращаем в operator*
: мы просто используем сам итератор. Обратите внимание, что шаблонный оператор = не перезаписывает встроенный оператор присваивания копии. Это все еще предоставляется.