有人可以就此提供一些见解吗? lambda是捕获外部变量,还是外部世界捕获lambda产生的值?捕获某个变量意味着什么?
答案 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?