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中实现.