【QT】关于Lambda 表达式的引用捕获和值捕获

[&]() {...}:引用捕获
[=]() {...}:值捕获

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()。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qtlambda表达式可以引用变量,通过捕获列表来控制对外部变量的访问。默认情况下,lambda表达式捕获外部变量,即复制一份外部变量的。这意味着,lambda表达式无法修改通过复制方式捕获的外部变量。如果希望修改这些变量,我们需要使用引用方式进行捕获。例如,使用"[&]"来按引用捕获所有外部变量。然后在lambda表达式,可以直接修改这些变量的。 使用lambda表达式引用变量的一个重要注意事项是延迟调用。在lambda表达式定义之后,如果外部变量发生了修改,lambda表达式仍然会使用最初捕获到的变量。例如,如果按捕获了一个外部变量,然后修改了这个变量的lambda表达式仍然会使用最初捕获到的。 需要注意的是,lambda表达式的语法形式可简单归纳如下: ``` [capture list](parameters) -> return type { body } ``` 其捕获列表用于指定需要捕获的外部变量,参数列表和返回类型用于指定lambda表达式的参数和返回类型,以及函数体用于实现具体的功能。 在Qtlambda表达式可以方便地定义和使用函数对象。捕获的外部变量将成为lambda表达式的成员变量,并可以在函数访问。得注意的是,没有捕获变量的lambda表达式可以直接转换为函数指针,而捕获变量的lambda表达式则不能转换为函数指针。 总结起来,Qtlambda表达式可以引用变量,并通过捕获列表来控制对外部变量的访问。可以按或按引用捕获外部变量,并在lambda表达式访问和修改这些变量的。使用lambda表达式可以方便地定义和使用函数对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值