Входной итератор, который не является прямым итератором, можно копировать, но вы можете «использовать» только одну из копий: увеличение одной из них делает недействительными другие (разыменование одной из них не делает недействительными другие). Это позволяет передавать его в алгоритмы, но алгоритм должен завершаться за один проход. Вы можете узнать, какие алгоритмы в порядке, проверив их требования - например, copy
требует только InputIterator, тогда как adjacent_find
требует ForwardIterator (первый, который я нашел).
Мне кажется, что это описывает вашу ситуацию. Просто скопируйте дескриптор (или что-то, что пересчитывает дескриптор), не дублируя его.
Пользователь должен понимать, что это всего лишь InputIterator, но на практике это не имеет большого значения. istream_iterator
то же самое, и по той же причине.
Оглядываясь назад, можно сказать, что с учетом C ++ 11 почти имело бы смысл требовать, чтобы InputIterator был перемещаемым, а не копировать его, поскольку дубликаты в любом случае имеют ограниченное использование. Но это «ограниченное использование», а не «бесполезное», и в любом случае уже слишком поздно, чтобы удалить функциональность из InputIterator, учитывая, сколько кода опирается на существующее определение.