2017-09-27 56 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

相關問題