Лямбда - это не std::function
, но из лямбды можно создать std::function
. Когда вы передаете f1
или f2
в foo()
, компилятор должен создать временный объект std::function
, чтобы передать его параметру f
. Однако ссылка lvalue на объект, отличный от const
, не может быть привязана к временному объекту, в точности так, как говорится в сообщении об ошибке.
Чтобы разрешить передачу временного объекта, Параметр f
необходимо изменить, чтобы он принимал std::function
либо:
- значение
- lvalue ссылка на
const
объект - rvalue ссылка
В противном случае вы должны сами создать std::function
в переменной, а затем передать вместо этого:
#include <iostream>
#include <functional>
//int foo(const std::function<int(int)> &f)
int foo(std::function<int(int)> &f)
{
return f(6);
}
int main(int argc, char **argv)
{
auto f1 = [=](int i){ if (i<5) {return 8*2;} else {return 2;} };
auto f2 = [=](int i){ if (i>3) {return i*i;} else {return 2;} };
std::function<int(int)> f = f1;
std::cout << foo(f) << "\n";
}