C ++ 11使用Capture进行Lambda传递

时间:2014-08-28 10:13:11

标签: c++ c++11 lambda

我正在尝试使用capture [&]传递lambda函数。存储捕获lambda的变量的正确声明是什么? [f2以下]

// Non-capturing
void (*f1)() = [](){   }; // Works

// All by reference
void (*f2)() = [&](){  }; // Syntax Error

1 个答案:

答案 0 :(得分:10)

C ++标准,第5.1.2 / 6节:[expr.prim.lambda]

  

非通用lambda表达式没有lambda-capture的闭包类型具有公共非虚拟非显式const转换函数,指向函数,具有C ++语言链接(7.5) )具有与闭包类型的函数调用操作符相同的参数和返回类型。此转换函数返回的值应为函数的地址,该函数在调用时与调用闭包类型的函数调用操作符具有相同的效果

由于你的lambda有一个捕获(默认值为:[&]),因此没有转换操作符指向函数的指针。


或者,您可以使用std::function<>来包装lambda:

#include <functional>
#include <iostream>

int main()
{
  int i = 42;  
  std::function<void(void)> f = [&](){ std::cout << i; };
  f();
}