Выражение p(v) должно быть преобразовано в bool для каждого аргумента v типа (возможно, const) VT, где VT — это тип значения ForwardIt, независимо от категории значения, и не должно изменять v
Я пытаюсь понять причину этого ограничения. Почему внесение изменений запрещено? Я думал, может быть, потому, что нет никакой гарантии, что каждый элемент будет посещен один раз, но:
- Очевидно, посещение только один раз наиболее эффективно с точки зрения производительности (Rust save гарантирует посещение один раз)
- Документация не запрещает использование внешних побочных эффектов в предикате, т. е. не требует, чтобы повторные вызовы одного и того же элемента давали один и тот же результат. Для меня это логически означает, что такие эффекты разрешены (например, в случае использования только максимального количества элементов, т.е. счетчик будет определять вывод предиката, а не аргумент предиката) и что повторные вычисления предиката для одного и того же объекта не производятся (в противном случае это может привести к другому результату, который будет логически противоречивым и потребует специального описания этого случая).
Функциональный объект pred не должен применять какие-либо непостоянные функции через разыменованный итератор и должен принимать аргумент const с одинаковым поведением независимо от того, является ли аргумент константным или нет.
Код: Выделить всё
constНо это всего лишь ограничение предиката, с таким же успехом можно было бы определить и основать remove_if на чем-то вроде модифицирующего предиката.
Почему команда remove_if была спроектирована так, что предикат не должен изменять аргумент?>
Подробнее здесь: https://stackoverflow.com/questions/798 ... -predicate
Мобильная версия