Lambda 函数的语法
[captures](parameters) -> return_type {
// function body
}
各部分的详细解释
[captures]:
捕获列表,定义了 lambda 函数中可以使用的外部变量。可以捕获值([x, y])、引用([&x, &y])或使用默认捕获方式([=] 捕获所有局部变量值,[&] 捕获所有局部变量引用)。
(parameters):
参数列表,和普通函数的参数列表相同,可以省略参数列表(如果没有参数)。
-> return_type(可选):
返回类型,可以省略,编译器会自动推导返回类型。
{ // function body }:
函数体,包含 lambda 函数的具体实现。
捕获列表的示例
// 捕获外部变量 x 和 y 的值
[x, y]() { return x + y; }
// 捕获外部变量 x 和 y 的引用
[&x, &y]() { x = y + 1; }
// 捕获所有外部变量的值
[=]() { return x + y; }
// 捕获所有外部变量的引用
[&]() { x = y + 1; }
示例
auto add = [](int a, int b) -> int {
return a + b;
};
int result = add(3, 4); // result = 7
int x = 10;
int y = 20;
auto add = [x, y]() -> int {
return x + y;
};
int result = add(); // result = 30
int x = 10;
int y = 20;
auto add = [&x, &y]() -> int {
x += y;
return x;
};
int result = add(); // result = 30
// 此时 x 的值也变为 30
int x = 10;
int y = 20;
// 隐式按值捕获所有外部变量
auto addValue = [=]() -> int {
return x + y;
};
// 隐式按引用捕获所有外部变量
auto addReference = [&]() -> int {
x += y;
return x;
};
int resultValue = addValue(); // resultValue = 30
int resultReference = addReference(); // resultReference = 30
// 此时 x 的值也变为 30
在 Qt 信号槽中使用 lambda 表达式
#include <QCoreApplication>
#include <QTimer>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, []() {
qDebug() << "Timer timeout!";
});
timer.start(1000); // 每隔1秒触发一次
return app.exec();
}
在这个示例中,lambda 函数被用作 QTimer 的槽函数,当定时器超时时,lambda 函数会被调用并输出一条调试信息。