Почему стандартная библиотека С++ не передает предикаты как &&

В С++ stl есть, например:

template<class InputIt, class UnaryPredicate>
constexpr InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );

Мой вопрос: почему нет:

... find_if(..., UnaryPredicate &&p);

В моем понимании это было бы более универсально. Предикаты R-значения по-прежнему будут передаваться по значению. Кроме того, могут быть переданы предикаты L-значения:

struct MyComplexPred { 
  MyComplexPred(MyComplexPred const &) = delete; // expensive/"impossible" copy
  MyComplexPred() { /*...*/ }
  bool operator()(int val) const { return true; /*...*/ }
};
int fun() {
  MyComplexPred pred;
  std::vector<int> a, b;
  std::find_if(a.begin(), a.end(), pred);  // impossible, no copy
  std::find_if(b.begin(), b.end(), pred);  // impossible, reuse predicate
  ...

Я нашел аналогичный вопрос здесь, но мне интересно, почему предложенный &&-переход со свертыванием ссылок не используется в stl для предикатов и других объектов-функций.


person Jarek C    schedule 23.06.2020    source источник
comment
Я предполагаю, что стандарт позволяет алгоритму копировать предикат. Наличие передачи по значению — это простой способ обеспечить возможность копирования предиката.   -  person NathanOliver    schedule 23.06.2020
comment
Кажется связанным stackoverflow.com/questions/48803927/   -  person StoryTeller - Unslander Monica    schedule 23.06.2020
comment
В связанном вопросе я нашел этот ответ: передача по ссылке (T&) не работает для временных или константных объектов, T const& не работает для неконстантных&, т. е. единственным выбором будет T&& (ссылка на пересылку), которая не не существовало до C++11, а интерфейсы алгоритмов не изменились с тех пор, как они были представлены в C++98. так что я считаю, что это все еще верно.   -  person Jarek C    schedule 23.06.2020