なぜ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
}
'foo'関数から何かを本当に返すべきです。あなたのMCVEのように何も返さないと、[* undefined behavior *](http://en.cppreference.com/w/cpp/language/ub)につながります。 –
'std :: function'オブジェクトにするには、関数の引数が必要ですか?単にテンプレートではありませんか?例えばのように。 'テンプレート auto foo(F fun) - > decltype(fun()){...}'。 –
いいえ、ラムダが返す戻り値の型を取る必要があるためです。私が知る限り、これには特長がありません。 – YotKay