lambda 表达式使用一对方括号作为开始的标识,类似于声明一个函数,只不过这个函数没有名字,也就是一个匿名函数,其返回值是自动推断的(函数体足够简单的情况),当然也可以指定返回值类型。
c++11 lambda语法形式:[=,&p](int a)->int mutable {return a}(3.5)
语法解析:
[]:引入符,表示lambdad表达式捕获同范围变量的形式(值传递,引用)
():lambda表达式实参
-> int: 指定lambda表达式的返回值类型
mutable: 改变值传递进来的变量,但是只是在lambda函数内部改变改变量的值,因为是值传递所以该变量的值实际上是没有改 变的
{}:函数体部分
(3.5):lambda表达式实质是函数对象,实参为3.5
lambda 引入符说明:
[] // 不捕获任何外部变量
[=] // 以值的形式捕获所有外部变量
[&] // 以引用形式捕获所有外部变量
[x, &y] // x 以传值形式捕获,y 以引用形式捕获
[=, &z] // z 以引用形式捕获,其余变量以传值形式捕获
[&, x] // x 以值的形式捕获,其余变量以引用形式捕获
另外有一点需要注意。对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入:
[this]() { this->someFunc(); }();
实例:
#include<iostream>
#include <functional>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
double dValue1 = [](double a) -> int{
return std::abs(a);
}(-3.5);//指定返回值类型为int 输出3
cout << dValue1 << endl;
std::vector<int> vecValue;
for (int i = 0;i < 10;i++)
vecValue.push_back(i);
int nVariable = 9;
int nDp = 23;
std::for_each(vecValue.begin(), vecValue.end(), [=,&nDp ](int nValue) mutable{
if (nValue== 0)
{
nVariable ++;
cout <<" lambda外部变量nVariable (值传递):"<< nVariable << endl;//输出10
dp++;
cout << "lambda外部变量nDp (引用):" << nDp << endl;//输出24
}
cout << nValue;
});
cout << endl;
cout <<"变量nVariable (引用)调用后:" << nVariable << endl;//值传递,输出9
cout << "变量nDp (引用)调用后:" << nDp << endl;//引用传递,输出24
system("pause");
return 0;
}