返回没有std :: function的lambda

fre*_*low 14 c++ lambda return-type higher-order-functions c++11

考虑以下返回lambda的函数:

std::function<int()> make_counter()
{
    int i = 0;
    return [=]() mutable { return i++; };
}
Run Code Online (Sandbox Code Playgroud)

是否可以返回实际的lambda类型,而不将其包装成std::function

Xeo*_*Xeo 19

C++ 11:不是.我引用每个lambda表达式(§5.1.2/ 3):

[...]一个独特的,未命名的非联盟类类型[...]

这实际上意味着在不首先知道相应表达式的情况下,您无法知道lambda的类型.

现在,如果你没有捕获任何东西,你可以使用转换到函数指针并返回它(函数指针类型),但这是非常有限的.

正如@Luc在休息室中所说,如果您愿意更换您的make_counter(如果它不是模板,或超载或其他东西),以下内容将起作用:

auto const make_counter = [](int i = 0) {
  return [i]() mutable { return i++; };
};
Run Code Online (Sandbox Code Playgroud)

C++ 1y:是的,通过正常函数的返回类型推导(N3582).


小智 10

如果你作弊并使用退货类型扣除,是的,你可以(链接).

请注意,这只能在C++ 11本身之外实现,尽管它可以使用lambdas(即lambda中返回lamba的lambda)在常规的非警告诱导C++ 11中实现.