我无法通过参考捕获传递lambda

时间:2019-09-23 04:10:15

标签: c++ function c++11 lambda function-pointers

以下代码因该错误而失败

  

E0413不存在从“ lambda [] float(int i)-> float”到“ float(*)(int i)”的合适转换函数

int test;   
float (*f)(int i) = [&](int i) -> float {return test; };

该如何解决?我需要Capture子句。

2 个答案:

答案 0 :(得分:4)

您只能使用无捕获的lambda进行上述操作。

请参见[expr.prim.lambda.closure] (第7秒)

  

具有 no的非泛型lambda表达式的闭包类型   满足的约束(如果有)的lambda-capture 具有一个   通过C ++语言链接将函数转换为指向函数的指针   具有与闭包类型相同的参数和返回类型   函数调用运算符。

由于lambdas are not just ordinary functions并捕获它需要保留状态, 您找不到任何简单或常规的解决方案来将它们分配给函数指针。


要解决此问题,您可以使用std::function,它会通过擦除类型来实现:

#include <functional> // std::function

int test;
std::function<float(int)> f = [&](int i) -> float {return static_cast<float>(test); };

答案 1 :(得分:2)

带捕获的lambda与函数指针不同,并且不能转换为一个。

可以将无捕获的lambda 转换为函数指针。

请参见CPPReference,尤其是开头的部分:

  

通用无捕获lambda具有用户定义的转换函数模板,该模板具有与函数调用运算符模板相同的发明模板参数列表。