学习笔记(1)提到了C++14对Lambda表达式参数推断的扩展。在C++14中,Lambda表达式还有一个重要的扩展,就是这篇文章中将要提到的捕获表达式。
在C++11中,捕获列表(就是方括号[]中的东西)用于指出哪些外层变量可以在Lambda内访问,并且指出访问的方式是值传递还是引用传递。而在C++14中,我们还可以对捕获列表的捕获变量“赋值”。这就带来了一些比较奇怪的特性,比如下面的代码:
//代码3.1
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a = 2;
[a = sin(a)]()
{
cout << cos(a) << endl;
}();
cout << a << endl;
cout << cos(a) << endl;
return 0;
}
猜猜这段代码会输出什么结果?
这段代码最难理解的地方是捕获列表(方括号)中的a = sin(a),因为这个表达式和通常的赋值表达式含义完全不同。
通常,我们写下a = sin(a);时,意味着首先用a当前的值计算出sin(a),然后把a的值替换为刚刚计算出的sin(a)。
然而在捕获列表中的a = sin(a),这两个a不是同一个a。sin(a)中的a是对外层类型为int的a的捕获,因而这个a的类型为int,值为2&