【问题标题】:What does the word capture mean in the context of lambdas?在 lambda 的上下文中,捕获这个词是什么意思?
【发布时间】:2015-08-13 04:02:13
【问题描述】:

有人可以就此提供一些见解吗?是 lambda 捕获外部变量,还是外部世界捕获 lambda 生成的值?捕获某个变量是什么意思?

【问题讨论】:

  • 我不明白你说的是什么意思,或者是外界捕获了 lambdas 产生的值,但也许this 回答了你的问题。
  • 它的字面意思是复制对象,(或对对象的引用)到函数的范围内。该函数从字面上捕获创建它的环境的一部分。这为其提供了可以使用的上下文数据。

标签: c++ c++11 lambda


【解决方案1】:

lambda 正在捕获一个外部变量。

lambda 是一种用于创建类的语法。捕获变量意味着将变量传递给该类的构造函数。

一个 lambda 可以指定它是按引用传递还是按值传递。例如:

[&] { x += 1; }       // capture by reference
[=] { return x + 1; } // capture by value

第一个生成的类大致如下:

class foo { 
    int &x;
public:
    foo(int &x) : x(x) {}
    void operator()() const { x += 1; }
};

第二个产生一个类似这样的类:

class bar {
    int x;
public:
    bar(int x) : x(x) {}
    int operator()() const { return x + 1; }
};

与引用的大多数用法一样,如果闭包(由 lambda 表达式创建的类的对象)比被捕获的对象寿命长,则按引用捕获会创建一个悬空引用。

【讨论】:

  • "lambda 是一种用于创建类的语法。"不一定。
  • @CoffeeandCode:哦?有哪些替代方案?
  • [](){/* ... body ... */} 可转换为普通函数指针void(*)(),因此可以实现为独立函数。无论如何,编译器可以为捕获 lambda 做各种诡计。它可以定义获取指向局部变量的指针并取消引用它们以进行捕获的函数。在某些情况下,它可以简单地将int x = /* captured value */ 附加到 lambda 主体。除了带有operator()() 的类之外,还有很多方法可以实现它。这真的取决于实施。
  • @CoffeeandCode: 嗯......标准似乎不同意(§5.1.2/3):“lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型——称为闭包类型——其属性如下所述。”确实,通常的“好像”规则适用于该类的实现,但它们并没有使它不再是一个类。
  • @CoffeeandCode 是的,它是一个带有转换运算符到函数指针的类
【解决方案2】:

Jerry Coffin 给了你详细的回复,我同意 lambda 是创建类的语法。关于变量的捕获方式和方式有很多选项。选项列表:

[]  Capture nothing (or, a scorched earth strategy?)
[&] Capture any referenced variable by reference
[=] Capture any referenced variable by making a copy
[=, &foo]   Capture any referenced variable by making a copy, but capture variable foo by reference
[bar]   Capture bar by making a copy; don't copy anything else
[this]  Capture the this pointer of the enclosing class

【讨论】:

    【解决方案3】:

    Lambda 会捕获否则无法访问的变量。可以指定 A lambda 应如何捕获变量。即 value,reference 。 这已经很好地解释了here In lambda functions syntax, what purpose does a 'capture list' serve?

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 2018-10-29
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      相关资源
      最近更新 更多