【问题标题】:I can't pass lambda with reference capture我不能通过引用捕获传递 lambda
【发布时间】:2020-01-23 02:49:19
【问题描述】:

以下代码因此错误而失败

E0413 没有合适的从 "lambda []float (int i)->float" 到 "float (*)(int i)" 的转换函数存在

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

我该如何解决这个问题?我需要 Capture 子句。

【问题讨论】:

  • 那你就不能使用函数指针了。 f 真的必须是指针吗?
  • A lambda (with captures) 是一些未指定的函子类型,与函数指针不同。

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


【解决方案1】:

您只能使用无捕获的 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); };

【讨论】:

    【解决方案2】:

    lambda(带有捕获)与函数指针不同,不能转换为一个。

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

    CPPReference,特别是开头的那位:

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

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 2019-08-28
      • 1970-01-01
      • 2018-11-18
      • 2015-09-25
      • 1970-01-01
      • 2011-09-16
      • 2015-03-12
      • 1970-01-01
      相关资源
      最近更新 更多