[&]() {...}
:引用捕获
[=]() {...}
:值捕获
1\ 值捕获 : = {…}
= 符号表示通过值捕获外部作用域中的变量。Lambda 表达式内部对这些变量的修改不会影响到外部的实际变量。这是一种只读方式的捕获方式。
int externalVariable = 42;
[=]() {
// externalVariable = 100; // 编译错误,无法修改外部变量
}();
2 \ & {…}:引用捕获
& 符号表示通过引用捕获外部作用域中的变量。Lambda 表达式内部对这些变量的修改会影响到外部的实际变量。这是一种可以修改外部变量的捕获方式。
int externalVariable = 42;
[&]() {
externalVariable = 100; // 修改外部变量
}();
补充:–2023年12月26日
Lambda 表达式是一种匿名函数,允许你在需要函数的地方内联定义函数。它的基本形式为:
[capture](parameter_list) -> return_type {
// 函数体
}
capture 捕获列表(可选):用于捕获外部变量。[&] 表示按引用捕获所有外部变量,这样在 lambda 表达式内部可以修改这些变量的值。
parameter_list 参数列表:类似于普通函数的参数列表。
return_type 返回类型(可选):指定 lambda 表达式的返回类型。
{} 函数体:包含 lambda 表达式的实际操作。
举例:
QTimer::singleShot(5000, [&alarmClock](){
alarmClock.cancelAlarm();
});
//QTimer::singleShot() 是一个便捷的静态函数,允许你创建一个单次性的定时器,即在一定时间后触发一次。
解析:
&alarmClock:表示按引用捕获 alarmClock 变量,这样在 lambda 表达式内部可以修改 alarmClock 对象的状态。
():空的参数列表,因为 cancelAlarm 方法不接受任何参数。
{}:Lambda 表达式的函数体,包含了要执行的操作,即调用 alarmClock.cancelAlarm()。