以下代码因该错误而失败
E0413不存在从“ lambda [] float(int i)-> float”到“ float(*)(int i)”的合适转换函数
int test;
float (*f)(int i) = [&](int i) -> float {return test; };
该如何解决?我需要Capture子句。
答案 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具有用户定义的转换函数模板,该模板具有与函数调用运算符模板相同的发明模板参数列表。