Lambda不使用函数接受std :: function

时间:2017-09-27 06:37:12

标签: c++

为什么这不适用于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
}

2 个答案:

答案 0 :(得分:2)

问题是<R>不能从lambda中推导出来。事实上,有许多类型Rstd::function可以保存你的lambda。

如果提供的参数为std::function<int()>,则R可以简单地推断为int()。但是lambda有自己独特的类型。它不是std::function

答案 1 :(得分:1)

您需要将模板参数添加到foo

foo<int> ([]() -> int { return 1; } ); // --> OK
foo<int> (lambda2); // --> OK