Каждый алгоритм стандартной библиотеки, который требует один или несколько предикатов, имеет особые требования для данных предикатов.Если вы посмотрите на std::find_if
:
template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );
Требования унарного предиката p
таковы:
p
- унарный предикат, которыйвозвращает true для требуемого элемента.
Выражение p(v)
должно быть преобразовано в bool
для каждого аргумента v
типа (возможно, const
) VT
, где VT
- этотип значения InputIt
, независимо от категории значения, и не должен изменять v
.[...]
Это означает, что тип UnaryPredicate
должен предоставлять оператор вызова, аналогичный (в вашем случае):
bool operator()(int const&) const;
Лямбда - это простоэкземпляр типа замыкания с перегруженным оператором вызова, чьи типы возврата и аргумента выводятся из лямбда-выражения.Это объявление:
auto lambda = [](int i) { return i > 4; };
... аналогично следующему с использованием анонимного типа:
struct {
bool operator()(int i) const { retuirn i > 4; }
} lambda;
И, как вы можете видеть, operator()
этого анонимного типа является действительнымотносительно требования std::find_if
, поэтому здесь можно использовать лямбду.