这是我的代码,我想像 javascript 一样在 C++ 中测试闭包。为什么编译器会产生此消息? “testLambda.cpp:在 lambda 函数中: testLambda.cpp:8:11: 错误:未捕获‘a’”
#include <iostream>
#include <functional>
std::function<bool(int)> returnLambda(int a){
auto b = 1;
auto c = 2;
return [&](int x)
{ return x*(b++)+c+a == 0;};
}
auto f = returnLambda(21);
int main(){
auto c = f(1);
auto b = f(1);
std::cout<<c<<b<<std::endl;
return 0;
}
最佳答案
您需要在方括号中指定您的捕获,这就是 lambda 表达式首先需要方括号的原因。您可以通过引用捕获它们:
[&a,&b,&c] (int x) ...
或按值:
[a,b,c] (int x) ...
或者混合起来:
[a,&b,c] (int x) ...
或者您可以只捕获您使用的所有内容:
[&] (int x) ... // by reference
[=] (int x) ... // by value
如果你选择按值捕获一个变量,但需要修改它,那么你需要使它可变:
[=] (int x) mutable ...
关于C++ lambda 值无法捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20754408/