lambda匿名函数
1、使用:
[外部变量访问方式说明符] (参数) mutable noexcept/throw() -> 返回值类型
{
函数体;
};
[外部变量方位方式说明符] :[ ] 方括号用于向编译器表明当前是一个 lambda 表达式,其不能被省略,通过捕获列表来确定匿名函数调用时使用哪些外部变量。
(参数):和普通函数的定义一样,lambda 匿名函数也可以接收外部传递的多个参数。和普通函数不同的是,如果不需要传递参数,可以连同 () 小括号一起省略
mutable:此关键字可以省略,如果使用则之前的 () 小括号将不能省略(参数个数可以为 0)
noexcept/throw():可以省略,如果使用,在之前的 () 小括号将不能省略(参数个数可以为 0)
-> 返回值类型:指明 lambda 匿名函数的返回值类型。值得一提的是,如果 lambda 函数体内只有一个 return 语句,或者该函数返回 void,则编译器可以自行推断出返回值类型,此情况下可以直接省略-> 返回值类型
函数体:
例子:
class Test
{
public:
void output(int x, int y)
{
auto x1 = [] {return m_number; }; // error
auto x2 = [=] {return m_number + x + y; }; // ok
auto x3 = [&] {return m_number + x + y; }; // ok
auto x4 = [this] {return m_number; }; // ok
auto x5 = [this] {return m_number + x + y; }; // error
auto x6 = [this, x, y] {return m_number + x + y; }; // ok
auto x7 = [this] {return m_number++; }; // ok
}
int m_number = 100;
};
int main() {
return 0;
}
[]里面捕捉的是作用域内的东西。
()里面是参数,下次调用函数时传入。
、、、cpp
int main(void)
{
// 包装可调用函数 function<返回值(函数列表)>
int x = 10;
std::function<int(int)> f1 = [=](int a) {return a+x; };
// 绑定可调用函数 std::placeholders是一个占位符 bind(函数,参数1,参数2);
std::function<int(int)> f2 = bind([](int a) {return a; }, placeholders::_1);
// 函数调用
cout << f1(100) << endl;
cout << f2(200) << endl;
return 0;
}
、、、
2、参数说明
捕获形式 说明
[] 不捕获任何外部变量(注意,可以使用全局变量和静态变量)
[a, b…] 默认以值得形式捕获指定的多个外部变量(用逗号分隔),如果引用捕获,需要显示声明(使用&说明符)
[this] 以值的形式捕获this指针
[=] 以值的形式捕获所有外部变量(包括lambda所在类的this)
[&] 以引用形式捕获所有外部变量(同上)
[=, &x] 变量x以引用形式捕获,其余变量以传值形式捕获
[&, x] 变量x以值的形式捕获,其余变量以引用形式捕获
例子:
#include <iostream>
#include <functional>
using namespace std;
#if 0
int main(void)
{
// 包装可调用函数 function<返回值(函数列表)>
int x = 10;
std::function<int(int)> f1 = [=](int a) {return a+x; };
// 绑定可调用函数 std::placeholders是一个占位符 bind(函数,参数1,参数2);
std::function<int(int)> f2 = bind([](int a) {return a; }, placeholders::_1);
// 函数调用
cout << f1(100) << endl;
cout << f2(200) << endl;
return 0;
}
#endif
int add(int x, int y)
{
return x+y;
}
int test(int a,int b, int *fun(int ,int))
{
return *fun(a,b);
}
int main(void)
{
int a =1,b=2;
int c = add(a,b);
auto addL = [] (int x,int y){
return x+y;
};
int d = addL(a,b);
test(a,b,add);
cout << c << endl;
cout << d << endl;
return 0;
}