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来修改。

链接地址: http://www.djcxy.com/p/30767.html

上一篇: lambda function pass vector in capture and modify it

下一篇: Waiting slots to be executed before quitting