2017-09-27 12 views
0

なぜlambdaでは動作しませんか?それは私が望む関数を呼び出す前にラムダをstd :: functionにしているときにのみ機能します。ラムダを構築したり、ラムダを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'オブジェクトにするには、関数の引数が必要ですか?単にテンプレートではありませんか?例えばのように。 'テンプレート auto foo(F fun) - > decltype(fun()){...}'。 –

+0

いいえ、ラムダが返す戻り値の型を取る必要があるためです。私が知る限り、これには特長がありません。 – YotKay

答えて

1

あなたはfooにテンプレートパラメータを追加する必要があります。

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

問題は<R>をラムダから演繹ではないということです。実際にはRのような多くのタイプがあり、std::functionがあなたのラムダを保持することができます。

引数がstd::function<int()>の場合、Rは、int()と簡単に推論できます。しかし、ラムダは独自のタイプを持っています。それはstd::functionではありません。

関連する問題