1. 概述
lambda表达式本质上是一个匿名函数。语法格式如下:
[capture](params)opt->return{body;}
2. 详细介绍
2.1 capture类型
语法 | 描述 |
---|
[] | 不捕获任何外部变量 |
[&] | 捕获外部作用域中的所有变量,并作为引用在函数体内部使用(按照引用捕获) |
[=] | 捕获外部作用域中的所有变量,并作为副本在函数体内部使用(按值捕获),拷贝的副本在函数体内部是只读的 |
[=,&test_var] | 按照值捕获外部作用域中的所有变量,但test_var 按照引用的方式捕获 |
[test_var] | 只捕获test_var ,且按照值方式捕获 |
[&test_var] | 只捕获test_var ,且按照引用方式捕获 |
[this] | 捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限,如果已经使用了& 或= 则默认添加此选项 |
2.2 opt类型
类型 | 描述 |
---|
mutable | 可以修改按照值传递方式传递的变量(修改的是拷贝而不是值本身) |
exception | 指定函数抛出的异常,如果抛出整数类型的异常,可以使用throw() |
3. 实例
void func_lam0(){
[](std::string str)->int{
std::cout << "func_lam0: " + str << std::endl;
return 0;
}("called");
return;
}
class Test{
public:
void tets(){
[this]{
m_test=0;
std::cout<< m_test << std::endl;
}();
}
int m_test;
};
void func_lam1(){
int a = 'a';
int b = 'b';
[](std::string str) mutable -> int{
std::cout << "func_lam1: " + str << std::endl;
std::cout << "capture b: " << b++ << std::endl;
return 0;
}("called");
std::cout << "a=" << a << "\t" << "b=" << b << std::endl;
return;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31