一:概述
1. lambda表达式语法, lambda表达式是在C++11标准中引入的,它们可以捕获外部变量的值或引用。
[ captures ] ( params ) specifiers exception -> ret { body }
其中:
captures 是捕获列表,用于捕获当前函数作用域的变量,分为按值捕获和按引用捕获。
params 是可选参数列表,和普通函数一样。
specifiers 是可选限定符,C++中可以用mutable,它允许在lambda中改变按值。
exception 是可选异常说明符,C++中使用noexcept指明lambda是否会抛出异常
ret 是可选返回值类型。
2. lambda表达式的例子
#include <iostream>
int main()
{
int a = 10;
auto foo = [a](int b)->int { return a * b; };
std::cout << foo(8) << std::endl;
}
3. 什么是无状态的正则表达式, 一个例子
//无状态的lambda表达式不捕获任何外部变量,或者只以值的方式捕获不会改变的常量
#include <iostream>
#include <functional>
int main() {
// 定义一个无状态的lambda表达式
auto add = [](int x, int y) {
return x + y;
};
// 调用无状态的lambda表达式
int result = add(2, 3);
std::cout << result << std::endl; // 输出 5
return 0;
}
二:注意事项
1. 静态变量和全局变量在lambda表达式中直接使用
#include <iostream>
int a = 1;
int main()
{
int b = 2;
static int c = 3;
auto foo = [b] { return a + b + c; };
std::cout << foo() << std::endl;
}
2. 按值捕获变量在lambda中不能修改。
void test()
{
int x = 10, y = 5;
auto foo = [x, y] {
x += 1; // 编译失败,无法改变x
y += 2; // 编译失败,无法改变y
return x * y;
};
std::cout << foo() << std::endl;
}
3. mutable的作用是可以修改按值捕获的变量
void test()
{
int x = 10, y = 5;
auto foo = [x, y] () mutable {
x += 1;
y += 2;
return x * y;
};
std::cout << foo() << std::endl;
}