捕捉这个词在lambdas的背景下意味着什么?

时间:2015-08-13 04:02:13

标签: c++ c++11 lambda

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

3 个答案:

答案 0 :(得分:18)

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表达式创建的类的对象)超出了捕获的对象,则通过引用捕获可以创建悬空引用。

答案 1 :(得分:4)

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

[]  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

答案 2 :(得分:3)

Lambda捕获否则无法访问的变量。可以指定A lambda应如何捕获变量.i.e值,引用。 这里已经很好地解释了这一点 In lambda functions syntax, what purpose does a 'capture list' serve?