若理解有误,同学赶紧指点
Lambda 表达式的作用是声明匿名函数,通常在局部使用,主要使代码更直观、简洁。
由表达式声明的匿名函数默认是只读的,若要在其中进行值变更,则应添加关键字 mutable .
* 使用示例:
// ① 使用按钮来触发匿名函数打印文本
QPushButton* btn = new QPushButton(this);
connect(btn, &QPushButton::pressed, [=]{ qDebug("Test") }); // 结果:Test
// ② 使用 auto 来指向匿名函数,供后续直接调用。
auto plus = [=](int v1, int v2) -> int { return v1 + v2; };
int sum = plus(1, 2);
* 表达式基本构成:
C++11 : [capture] (params) specifiers ->return type {body};
C++14 : params 支持 auto 关键字。
C++20 : [capture] <tparams>(params) specifiers ->return type {body}; // 支持模板
C++23 : [capture] specifiers {body};
* 构成部分说明:
[capture] :捕获列表,可在所在类的成员与所在函数体的局部变量范围内,对参数进行捕获以供匿名函数内调用。
[=]: 以值传递的方式获取可捕获范围内的所有参数。
[&]: 以引用的方式获取可捕获范围内的所有参数。
[var] / [&var]: 以参数名的形式获取指定参数。
[this]: 通过 this 指针获取对应类的成员。
支持多个参数,但顺序严格为先【=/&】符再【var】,如:
int a = 1;
int b = 2;
// 先用 = 来以值传递的方式获取范围内所有参数,但对 b 以引用的形式传递。
[=, &b]
{
qDebug << a + b;
}
或者获取多个特定参数【var1, var2, ...】.
(params) : 与普通函数形参列表无异。不使用时可连 () 一起省略。
specifiers : 一些可选的 Lambda 参数,常用的有 mutable 、exception 等, return type 实际也包含其中。
return type : 显式指定返回类型,也可以不指定由编译器从函数体中的 retruen 语句来推导。格式 ->type ,不指定时可省略。
{body} : 函数的逻辑代码,与普通函数体无异。