【发布时间】:2019-12-26 00:07:03
【问题描述】:
我正在尝试返回一个 lambda 函数,该函数从当前范围内捕获一个变量。当我不捕获变量时,返回lambda函数,可以毫无问题地执行:
#include <iostream>
typedef void(*VoidLambda)();
VoidLambda get() {
VoidLambda vl = []() {
std::cout << "hello" << std::endl;
};
return vl;
};
int main()
{
get()(); //prints "hello" as expected
return 0;
}
如果vl 试图捕获一个变量,编译器将不再编译它:
#include <iostream>
typedef void(*VoidLambda)();
VoidLambda get(const char* x) {
VoidLambda vl = [x]() { //Error: no suitable conversion function from "lambda []void ()->void" to "VoidLambda" exists
std::cout << x << std::endl;
};
return vl;
};
int main()
{
get("hello")();
return 0;
}
我已经尝试将第二个 lambda 转换为 VoidLambda,但问题仍然存在。
我想知道第一个和第二个 lambda 表达式有什么区别,以及如何解决问题(即返回带有捕获的 lambda 函数)。
【问题讨论】:
-
每个 Lamba 都有一个唯一的(特定于实现的)类型。因此,期望任何两个 lambda 具有相同的类型,即使它们具有相同的捕获和参数列表,也是毫无意义的。如果您想使用命名类型传递 lambda,您的代码需要使用模板、自动类型推导或模板化帮助器(例如
std::function)的某种组合。