return f1(a, [&](int b) -> bool { return f(a+b); });
Здесь второй аргумент, который является лямбда-выражением, является временным объектом, который нельзя привязать к неконстантной ссылке. Я считаю, что сообщение об ошибке вводит в заблуждение; это точно не говорит о проблеме. Хороший компилятор выведет лучшее сообщение об ошибке. Попробуйте GCC или Clang.
Исправление таково: второй аргумент не ссылается:
template<typename Functor>
bool f1(int a, Functor f) //I removed `&` from the second parameter
{
return f(a+1);
}
Аналогично, сделайте все параметры Functor
в других функциях не ссылочными. Передавать функтор как ссылку не имеет особого смысла, особенно в C ++ 11, в котором вы также можете передавать лямбду, которую вы можете определить на лету.