C++11新特性(33)- lambda表达式(4)

可以认为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表达式是个好东西,但也要理解才行。


觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

猜你喜欢

转载自blog.csdn.net/craftsman1970/article/details/80627921