Appearance
- Lambda表达式
- C++11 后支持
- 格式
[捕获列表] (形参列表) mutable -> 返回值类型 {函数体}[]可捕获外界变量供表达式使用[var1, var2][=]编译器将根据内部使用,自动捕外部作用域对应变量- 如果没有
mutable修饰,那么捕获参数默认只读 - 如果有
mutable修饰,则可以修改
- 如果没有
[&var1, &var2]使用引用捕获,参数和外部变量将是同一个值[&]编译器根据内部使用,自动捕获对外部作用域应变量的引用- 无论是否有
mutable修饰,都可以在表达式更改捕获
- 无论是否有
[&, k]除了 k 是值捕获,其余是引用捕获[=, &var1]除了 var1 是引用捕获,其余为值捕获(参数列表)和一般函数相同-> 返回值类型可省略,编译器将自动推导(如果返回整数,定义为浮点数,则以定义的为主)
- 匿名表达式实际上是通过类实现的
cpp
#include <iostream>
using namespace std;
int main() {
int m = 520;
int n = 1314;
int k = 999;
// lambda表达式
auto fun = [&]() mutable {
cout << "m = " << m << endl;
cout << "n = " << n << endl;
cout << "k = " << k << endl;
};
fun();
}cpp
#include <iostream>
using namespace std;
int main()
{
int m = 520;
int n = 1314;
int k = 999;
int g = 111;
class __lambda_12_14
{
public:
inline /*constexpr */ void operator()()
{
std::operator<<(std::cout, "m = ").operator<<(m).operator<<(std::endl);
std::operator<<(std::cout, "n = ").operator<<(n).operator<<(std::endl);
std::operator<<(std::cout, "k = ").operator<<(k).operator<<(std::endl);
}
private:
int m;
int n;
int k;
public:
__lambda_12_14(int & _m, int & _n, int & _k)
: m{_m}
, n{_n}
, k{_k}
{}
};
__lambda_12_14 fun = __lambda_12_14{m, n, k};
fun.operator()();
return 0;
}