语法形式:
[函数对象参数] [(表达式参数)] [mutable/exception声明] [->返回值类型] {函数体}
/**
* c++ lambda表达式
*
* 语法形式:[函数对象参数] [(表达式参数)] [mutable/exception声明] [->返回值类型] {函数体}
*
* 1. 函数对象参数
* [] :无参数
* [=] :值传递所有可见的局部变量
* [a] :值传递局部变量a
* [&] :引用传递所有可见的局部变量
* [&a]:引用传递局部变量a
* [&,a]:a是值传递,其他可见的局部变量是引用传递
* [=,&a]:a是引用传递,其他可见的局部变量是引用传递
*
* lambda的可见性不高于函数对象参数的可见性(使用了局部变量的lambda只能在局部变量可见的区域有效)
*
* 2. 表达式参数(方法参数)
* 与一般函数参数一致;若无参数,则可省略
*
* 3. mutable或exception声明
* 可省略,与函数的mutable和exception声明一致
* mutable声明可修改参数的拷贝
*
* 4. 返回值类型
* 可省略
*
* 5. 函数体
* 与普通函数一致
*/
#include <iostream>
using namespace std;
typedef bool (*fun)(const int &v);
void exec(fun f, int &v)
{
bool ret = f(v);
}
fun getFun()
{
int a = 100;
char str[100];
auto f0 = [a](const int &v) -> bool { return a > v; }; // 显式指定函数对象参数为a;显式指定返回值类型为bool;表达式参数v
auto f1 = [=](const int &v) { return a > v; }; // 函数对象参数为=,函数体内可以使用所有可见的局部变量,并且是值传递方式;隐式指定返回值类型为bool
auto f2 = [&](const int &v) { return a > v; }; // 函数对象参数为&,函数体内可以使用所有可见的局部变量,并且是引用传递方式;隐式指定返回值类型为bool
auto f3 = [](const int &v) { return 1 > v; }; // 无函数对象参数;隐式指定返回值类型为bool
auto f4 = [&a](const int &v) { a = v; }; //
auto f5 = [&a] { cout << a << endl; }; // 省略表达式参数;省略返回值
auto f6 = [a, str](const int &v) {};
// return (fun)f0; // 代码错误,使用了局部变量,则lambda不能离开局部区域
return f3; // 无局部变量,正确
}
参考:
C++之Lambda表达式