C ++ 11 - lambda函数在捕获中传递向量并对其进行修改

时间:2017-06-27 15:11:52

标签: c++11 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;
}

为什么我不能修改在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将不再可用,它将超出范围。

1 个答案:

答案 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;
}};

[Live example]

(我还冒昧地删除了声明中的双重类型规范)。

当然,请记住,捕获中的kk副本是lambda对象的本地副本。调用kk不会修改main中的本地变量foo