【问题标题】:How can I disable implicit lamba variable capture?如何禁用隐式 Lamba 变量捕获?
【发布时间】:2017-05-24 18:39:14
【问题描述】:

如何禁用隐式 lambda 变量捕获?

例如,如果我有一个正在对数组中的每个条目调用的 lambda,并且我不想捕获任何变量,我该如何禁用隐式捕获?我更喜欢使用显式捕获列表,因为这意味着我只抓取我认为我正在抓取的内容。


原来我对 [] 捕获的工作方式大错特错。以防万一有人在将来发现这个问题,除了上面对我的(被误导的)问题的接受答案之外,这里还有一些有希望的帮助信息。

捕获列表可以如下传递:

  • [a,&b] 其中 a 是通过副本捕获的,b 是通过引用捕获的。
  • [this] 通过引用捕获当前对象(*this)
  • [&] 通过引用捕获 lambda 主体中使用的所有自动变量,如果存在则通过引用捕获当前对象
  • [=] 通过复制捕获 lambda 主体中使用的所有自动变量,并通过引用捕获当前对象(如果存在)
  • [] 什么也捕捉不到

如果一个变量没有自动存储持续时间(即它不是一个局部变量,或者它是静态的或线程局部的),或者如果它不是在 lambda 的主体中使用 odr,则可以在不被捕获的情况下使用它。

来源:http://en.cppreference.com/w/cpp/language/lambda

换句话说,如果你想禁用隐式捕获,只需使用并清空一组括号[]

【问题讨论】:

  • 什么“隐式捕获”?? Afaik 没有这样的事情。
  • 您需要提供一些代码来解释您的意思:lambdas 的默认行为是不捕获任何局部变量,也不可能不捕获全局变量。
  • @JesperJuhl 在类型定义方面有“隐式捕获”之类的东西,但不清楚这就是 OP 所说的......
  • 您是否尝试过不使用 lambda 中的变量?

标签: c++ c++11 lambda


【解决方案1】:

唯一的“隐式捕获”发生在作用域中的静态和全局变量上。而且没有办法摆脱它。

【讨论】:

  • 也不需要,因为这些捕获是免费的:编译器在编译时知道这些变量的地址,因此访问它们很简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多