Почему remove_if не позволяет изменять объекты в предикате? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему remove_if не позволяет изменять объекты в предикате? [закрыто]

Сообщение Anonymous »

В документации std::remove_if говорится о предикате p:

Выражение p(v) должно быть преобразовано в bool для каждого аргумента v типа (возможно, const) VT, где VT — это тип значения ForwardIt, независимо от категории значения, и не должно изменять v

Я пытаюсь понять причину этого ограничения. Почему внесение изменений запрещено? Я думал, может быть, потому, что нет никакой гарантии, что каждый элемент будет посещен один раз, но:
  • Очевидно, посещение только один раз наиболее эффективно с точки зрения производительности (Rust save гарантирует посещение один раз)
  • Документация не запрещает использование внешних побочных эффектов в предикате, т. е. не требует, чтобы повторные вызовы одного и того же элемента давали один и тот же результат. Для меня это логически означает, что такие эффекты разрешены (например, в случае использования только максимального количества элементов, т.е. счетчик будет определять вывод предиката, а не аргумент предиката) и что повторные вычисления предиката для одного и того же объекта не производятся (в противном случае это может привести к другому результату, который будет логически противоречивым и потребует специального описания этого случая).
Я также нашел описание предиката, в котором говорится:

Функциональный объект pred не должен применять какие-либо непостоянные функции через разыменованный итератор и должен принимать аргумент const с одинаковым поведением независимо от того, является ли аргумент константным или нет..

Но это всего лишь ограничение предиката, с таким же успехом можно было бы определить и основать remove_if на чем-то вроде модифицирующего предиката.
Почему команда remove_if была спроектирована так, что предикат не должен изменять аргумент?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... -predicate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»