我有这段代码:
#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;
}
为什么我不能修改在lambda函数内通过捕获传递的向量kk
?
我收到了这个错误:
11:21:错误:传递&#39; const std :: vector&#39;作为&#39;这个&#39;的论点 &#39; void std :: vector&lt; _Tp,_Alloc&gt; :: push_back(std :: vector&lt; _Tp, _Alloc&gt; :: value_type&amp;&amp;)[with _Tp = int; _Alloc = std :: allocator; std :: vector&lt; _Tp,_Alloc&gt; :: value_type = int]&#39;丢弃限定符 [-fpermissive]
我可以通过引用传递它,但问题是,如果从线程调用我的lambda并且vector将不再可用,它将超出范围。
答案 0 :(得分:2)
默认情况下,闭包类型将其operator()
声明为const
- 限定成员函数。这意味着副本捕获的对象无法在lambda中修改。要使operator()
成为非const
成员函数,您必须标记lambda mutable
:
std::function<int(int)> foo{[kk](int x) mutable
{
kk.push_back(1);
return kk[0]+1;
}};
(我还冒昧地删除了声明中的双重类型规范)。
当然,请记住,捕获中的kk
副本是lambda对象的本地副本。调用kk
不会修改main
中的本地变量foo
。