В С++ 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 для предикатов и других объектов-функций.