§ · 前言
在阅读本文前,您需要知道基本的函数定义方式如:
void outp(const char* s){std::cout<<s;}
文中的一些标识符:
ret-type : 该函数的返回值。func-name : 函数名称。para : 参数(列表)。statement : 函数主体。capture : 捕捉列表。
一、基本
我们知道,一般的函数定义方式:
ret-type func-name(para) {statement}
二、描述
C++11支持匿名函数,称 Lambda函数(也即Lambda表达式),它可以将函数看作对象,像对象一样被使用 (不是那个意思啊喂(#`O′)),也可以像一般函数一样传入参数、求值。
三、语法
Lambda的定义本质上与一般函数很像,如下:
[capture](para)【mutable】【->ret-type】{statement}
其中,
para 即参数列表,为空时可省略(仅当没有mutable修饰符时)。mutable ,默认情况下,Lambda总是const函数,使用该修饰符以取消常量性,此时参数列表不可省略(即使为空)。->ret-type ,返回类型,为void 时可连同-> 一起省略,返回类型明确时也可以省略,让编译器推导,一般建议写一下防止出错。capture ,捕捉列表,Lambda仅能访问当前(Lambda内部)定义域及参数列表传入的参数(成为闭包–Closure–行为),若要传入外部变量,需要在[ ] 中声明,有以下形式:[ ]
[=]
[&]
[x]
[&x]
[this]
[*this]
[x,&y]
[&,x]
[&x,=]
实际上,[ ] 也是Lambda表达式开始的标识。 需注意,对于[=] 和[&] ,Lambda可以使用this ,但对于空捕捉([ ] ,或仅引用一些变量的[x,&y,z,w] ),需要显式的捕捉[this] 以使用它:...
class ex{
public:
ex(){}
private:
void outp(){cout<<"hello world";}
public:
function<void()> func=[this]{this->outp();};
}test;
test.func();
实际上,最简单的Lambda可以是:
[]{}
屁用没有
四、调用
Lambda函数是匿名的,声明时没有名称,不能独立成句,可以这么写:
auto outp=[]{cout<<"hi";}
outp();
当将一个变量赋值为Lambda时,就可以当做函数使用了,要记得加() ,参数放里面。 也可以使用模板std::function<> (function<>模板):
using namespace std;
function<void()> outp=[]{cout<<"hi";}
请注意,对于递归函数,请不要使用Lambda声明,否则可能发生意想不到的错误(就跟inline 一样)
@HaohaoCppDebuger|寻兰? 2021/11/19?
-----THE END----- THANK YOU !
|