C++11 Lambda : Capturing local variables

C++11 Lambda : How to capture local variables inside Lambda ?

本文将介绍如何在lambda中从外部域捕获变量,同样的,我们可以以值传递或引用传递的方式捕获变量,以下是语法:

1
[Captured variables](paameters) { function code }

Capturing Local Variables by value inside Lambda Function

以下是以值传递捕获变量的方式:

1
2
3
4
5
6
7
8
9
// Local Variables
std::string msg = "Hello";
int counter = 10;

// Defining Lambda function and
// Capturing Local variables by Value
auto func = [msg, counter] () {
//...
};

msg和counter都是const变量,只读不改。要想修改,可以加入关键字mutable:

1
auto func = [msg, counter] () mutable { };

Capturing Local Variables by Reference inside Lambda

要实现引用传递,只需要加上前缀&即可。

1
2
3
4
5
6
7
8
9
// Local Variables
std::string msg = "Hello";
int counter = 10;

// Defining Lambda function and
// Capturing Local variables by Reference
auto func = [&msg, &counter] () {
//...
};

这样在lambda中就可以通过修改该引用从而修改外部值。

Capture All Local Variables from outer scope by Value

正如前面的文章提到过的,我们也可以把外部变量全部捕获,或值传递或引用传递,甚至可以混合使用:

1
2
3
4
5
6
7
8
9
10
11
12
// Capturing all Local variables by Value
auto func = [=] () {
//...
};

// Capturing all Local variables by Reference
auto func = [&] () {
//...
};

// Capturing all Local variables by Reference and Value
auto func = [=, &counter] () mutable {};

Be-aware of capturing local variables by Reference in Lambda

如果在lambda中我们通过引用捕获局部变量,那么我们需要确保在访问或调用lambda函数时,所有引用捕获的局部变量仍然在作用域内。

如果该变量已经被回收或者从stack中移除,会导致undefined behavior。