我正在尝试使用capture [&]传递lambda函数。存储捕获lambda的变量的正确声明是什么? [f2以下]
// Non-capturing
void (*f1)() = [](){ }; // Works
// All by reference
void (*f2)() = [&](){ }; // Syntax Error
答案 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();
}