代码之家  ›  专栏  ›  技术社区  ›  M.kazem Akhgary

我不能通过参考捕获

  •  0
  • M.kazem Akhgary  · 技术社区  · 6 年前

    以下代码失败,并出现此错误

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

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

    我该怎么解决?我需要抓捕条款。

    2 回复  |  直到 6 年前
        1
  •  1
  •   JeJo    6 年前

    你只能用捕获更少的lambda来完成以上操作。

    [expr.prim.lambda.closure] (秒7)

    非泛型lambda表达式的闭包类型 不 lambda捕获 其约束条件(如果有) 心满意足 从函数到指针的转换 用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
  •  1
  •   Marshall Clow    6 年前

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

    少捕的羔羊 可以 转换为函数指针。

    CPPReference ,特别是开始的位:

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