lambda函数通过向量捕获并修改它
我有这样的代码:
#include <iostream>
#include <functional>
#include <vector>
int main () {
std::vector<int> kk;
kk.push_back(2);
std::function<int(int)> foo = std::function<int(int)>([kk](int x)
{
kk.push_back(1);
return kk[0]+1;
});
std::cout << "foo: " << foo(100) << 'n';
return 0;
}
为什么我不能修改向量kk
,在lambda函数内部通过捕获传递?
我得到这个错误:
11:21:错误:将'const std :: vector'作为'this'参数传递给'void std :: vector <_Tp,_Alloc> :: push_back(std :: vector <_Tp,_Alloc> :: value_type &&)[with _Tp = int; _Alloc = std :: allocator; std :: vector <_Tp,_Alloc> :: value_type = int]'丢弃限定符[-fpermissive]
我可以通过引用传递它,但问题是,如果从线程调用lambda表达式并且向量将不再可用,它将超出范围。
默认情况下,闭包类型将其operator()
声明为const
限定的成员函数。 这意味着副本捕获的对象不能在lambda内部修改。 为了使operator()
非const
成员函数,你必须标记拉姆达mutable
:
std::function<int(int)> foo{[kk](int x) mutable
{
kk.push_back(1);
return kk[0]+1;
}};
[现场示例]
(我也冒昧地删除了声明中的double类型说明)。
当然,请记住,捕获中创建的kk
的副本对于lambda对象是本地的。 main
的局部变量kk
不会通过调用foo
来修改。