galushin / saga

GNU General Public License v3.0
0 stars 0 forks source link

"Лишние" инкременты в курсорах #1249

Open galushin opened 1 year ago

galushin commented 1 year ago

See also: https://cplusplus.github.io/LWG/issue2471

The extra trailing increment on ranges::copy_n causes trouble when you use it with an istream_iterator source, as istream_iterator performs an irreversible action on increment.

Essentially, this will consume 6 ints from the source stream, instead of 5:

ranges::copy_n(std::istream_iterator(is), 5, dest); A similar issue exists with copy, take, and istream_view - the following will consume 6 ints from the source stream also:

ranges::copy(std::istream_view(is) | views::take(5), dest);

Можно решить за счёт изменения интерфейса курсора: разыменование возвращает optional, а отдельной функции проверки исчерпания нет. Проблема в том, что optional<T&> запрещён в стандарте. Ещё один аспект - нарушения взаимодействия с range-based циклом for