2017-09-27 60 views
0

为什么不使用lambdas?它只在我调用我想要的函数之前将lambda转换为std :: function时才起作用。当我构建lambda时或将lambda指定为auto时不起作用。Lambdas不能使用函数接受std :: function

#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

你应该真的*从你的'foo'函数返回一些东西。没有返回任何东西,就像你在MCVE中做的那样,导致[* undefined behavior *](http://en.cppreference.com/w/cpp/language/ub)。 –

+0

你是否需要*函数参数是一个'std :: function'对象?它不能仅仅是一个模板吗?像例如'template auto foo(F fun) - > decltype(fun()){...}'。 –

+0

不,因为我需要返回lambda返回的类型。据我所知,这不是特质。 – YotKay

回答

1

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

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

问题是<R>不是来自拉姆达推断出来。其实有很多种类R这样std::function可以容纳你的lambda。

当所提供的参数是std::function<int()>R可以平凡推断为int()。但拉姆达有自己独特的类型。这不是std::function

相关问题