C++11新特性- lambda表达式详解
扫描二维码
随时随地手机看文章
可以认为lambda表达式取得信息有两种方式,或者说两个时机:一个是参数列表,其内容是在表达式被调用时决定;另一个捕获列表,其内容是在是表达式被创建的时候决定,本文讨论捕获列表。
值捕获
先看如下代码:
int factor = 2; auto multiply = [factor](int value) {return factor * value;}; factor = 4; cout << multiply(2) << endl;
代码中首先为factor赋值2,创建lambda表达式以后,再次赋值4。由于lambda表达式的捕获是在该表达式创建是进行的,而第二次赋值在lambda表达式创建之后,所以muliply(2)的执行结果为4。
引用捕获
还是这段代码,只要在捕获列表中变量的前面多了一个&,就变成了引用捕获。
int factor = 2; auto multiply = [&factor](int value) {return factor * value;}; factor = 4; cout << multiply(2) << endl;
捕获的时机并没有变化,只是捕获的是factor的引用而不是factor的值,所以定义lambda之后,对factor再次赋值4依然会影响multiply(2)的结果。此时的输出为8。
隐式捕获
前面例子中使用捕获列表时,具体指定了变量名,属于显式捕获。另外还有隐式捕获,由lambda表达式推断需要捕获的变量。具体方法是:
当需要隐式值捕获时,使用[=];
当需要隐式引用捕获时,使用[&];
在上面例子中使用隐式捕获以后,结果不会发生变化。
作者观点
lambda表达式是个好东西,但也要理解才行。