为什么这不适用于lambdas?它只适用于我在调用我想要的函数之前将lambda配置为std :: function。当我在适当的位置构建lambda或将lambda赋值给auto时,它不起作用。
#include <functional>
template <typename R>
R foo (std::function<R()> fun)
{
puts(__PRETTY_FUNCTION__);
}
int main()
{
std::function<int()> lambda = []{ return 1; };
foo (lambda); // --> OK
foo ([]() -> int { return 1; } ); // --> ERROR
auto lambda2 = []{ return 1; };
foo (lambda2); // --> ERROR
}
答案 0 :(得分:2)
问题是<R>
不能从lambda中推导出来。事实上,有许多类型R
,std::function
可以保存你的lambda。
如果提供的参数为std::function<int()>
,则R
可以简单地推断为int()
。但是lambda有自己独特的类型。它不是std::function
。
答案 1 :(得分:1)
您需要将模板参数添加到foo
:
foo<int> ([]() -> int { return 1; } ); // --> OK
foo<int> (lambda2); // --> OK