Я изучаю С++, и я пытаюсь реализовать двоичную функцию поиска, которая находит первый элемент, для которого выполняется предикат. Первый аргумент функции - это вектор, а второй аргумент - это функция, которая оценивает предикат для данного элемента. Функция двоичного поиска выглядит следующим образом:
template <typename T> int binsearch(const std::vector<T> &ts, bool (*predicate)(T)) {
...
}
Это работает как ожидалось, если используется так:
bool gte(int x) {
return x >= 5;
}
int main(int argc, char** argv) {
std::vector<int> a = {1, 2, 3};
binsearch(a, gte);
return 0;
}
Но если я использую функцию лямбда как предикат, я получаю ошибку компилятора:
search-for-a-range.cpp:20:5: error: no matching function for call to 'binsearch'
binsearch(a, [](int e) -> bool { return e >= 5; });
^~~~~~~~~
search-for-a-range.cpp:6:27: note: candidate template ignored: could not match 'bool (*)(T)' against '(lambda at
search-for-a-range.cpp:20:18)'
template <typename T> int binsearch(const std::vector<T> &ts,
^
1 error generated.
Вышеприведенная ошибка генерируется
binsearch(a, [](int e) -> bool { return e >= 5; });
Что случилось? Почему компилятор не убежден в том, что моя лямбда имеет правильный тип?