Lambda 表达式是 C++ 中的一个功能,它允许你创建匿名函数。Lambda 表达式的通用语法如下:
[capture](parameters) mutable -> return_type { body }
各部分的含义如下:
不捕获任何外部变量:
[]{ /* code */ }
按值捕获所有外部变量:
[=]{ /* code */ }
按引用捕获所有外部变量:
[&]{ /* code */ }
按值捕获特定变量:
[x]{ /* code */ }
按引用捕获特定变量:
[&x]{ /* code */ }
混合捕获模式:
[x, &y]{ /* code */ }
隐式捕获某些变量,显式捕获其他变量:
[=, &x]{ /* code */ }
[&x, y]{ /* code */ }
不捕获任何外部变量:
[]{ return 42; }
一个简单的 lambda,不使用任何外部变量,返回 42。
按值捕获外部变量:
int x = 1;
auto l = [=]{ return x + 1; };
这个 lambda 按值捕获 x
,返回 x + 1
的结果。
按引用捕获外部变量并修改:
int x = 1;
auto l = [&x]{ ++x; };
按引用捕获 x
并在 lambda 内部对其进行修改。
具有参数的 lambda:
auto l = [](int a, int b){ return a + b; };
一个接受两个整数参数并返回它们的和的 lambda。
可变 lambda(修改按值捕获的变量):
int x = 1;
auto l = [x]() mutable { return ++x; };
mutable
关键字允许 lambda 修改按值捕获的变量。
带有显式返回类型的 lambda:
auto l = [](int a, int b) -> double { return (a + b) / 2.0; };
一个计算平均值的 lambda,显式指定返回类型为 double
。
Lambda 表达式在 C++11 及更高版本中非常有用,特别是在需要简洁的回调函数、临时函数对象或在 STL 算法中使用的场合。在 Qt 中,lambda 通常用于信号和槽的连接,因为它们可以简化代码并提高可读性。