当前位置: 首页 > 知识库问答 >
问题:

C 11-lambda函数在捕获和修改中传递向量

寇坚成
2023-03-14

我有这个代码:

#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:错误:将“const std::vector”作为“void std:”vector的“this”参数传递

我可以通过引用传递它,但问题是,如果从线程调用lambda,那么它将超出范围,矢量将不再可用。

共有1个答案

齐昆
2023-03-14

默认情况下,闭包类型将其oper()声明为const限定的成员函数。这意味着通过复制捕获的对象不能在lambda内部修改。要使oper()成为非const成员函数,您必须将lambda可变标记为:

std::function<int(int)> foo{[kk](int x) mutable
{
    kk.push_back(1);
    return kk[0]+1;
}};

[现场示例]

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

当然,请记住,在捕获中制作的< code>kk副本是lambda对象的本地副本。调用< code>foo不会修改< code>main中的局部变量< code>kk。

 类似资料:
  • 我有两个功能。一个是,它以Int x和函数p作为参数,并返回布尔结果p(x)。就这么简单。 然后我有第二个函数,它就像 在调用时,有没有办法更改,使其像?(如果f返回true,则将其设为false) 比如: 我知道我可以通过masterChecker调用,但我想知道的是,是否可以更改作为参数传递的函数行为。

  • 对不起,我不知道这个问题的标题是什么。 我在C中有一个函数,它以λ作为参数。 然后我尝试调用这个函数。 我的问题是,我无法从lambda函数内部访问变量,如果我试图用

  • 下面可以看到使用的示例。我希望能够创建Foo的实例,其中每个实例都能够,在本例中,调用一个prespeficied getter函数。 我有大量具有可获取属性的类,并且需要能够在不同的地方获取所有这些属性,但唯一改变的是类的getter名称。

  • 我正在尝试将参数传递给作为参数传递的函数指针。 代码: 我得到了这个错误: 类型"void"的参数与类型"void(*)(wchar_t*,wchar_t*)"的参数不兼容 如何解决此问题以完成我想要实现的目标? 编辑:对不起,不清楚。我实际上试图完成的是将函数注入子进程并传递两个参数(wchar_t*、wchar_t*),以便我可以使用它们。但主函数可以是void或int argc、char**

  • call.enqueue(new Callback(){ GetAllJsonDatum是一个类。我正在收到更多的THANK100000记录,我需要在后台处理这些数据,现在我需要访问它的一个函数或使它公开,以访问它在公共void onResponse(Call Call,Response Response)之外或制作这个响应的副本;谢谢