You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确理解C++中的`[&]{ obj.method(); }`表达式?

关于C++ Lambda表达式的两个问题解答

1. 为什么大括号内的语句要带分号?

你看到的[&]{ bedroom_light.on(); }是C的lambda表达式,大括号{}里的部分就是lambda的函数体,和普通函数的函数体遵循完全相同的C语法规则——每条执行语句结束都必须加;。bedroom_light.on()是调用对象的成员函数,属于一条完整的执行语句,所以必须加分号。

2. 为什么用[&]而非单独的&?

lambda表达式的语法明确要求,捕获外部变量的列表必须放在开头的方括号[]内,这是lambda的标志性语法结构,不能省略方括号:

  • [&]是lambda的捕获方式之一,表示按引用捕获当前作用域内的所有外部变量,这里就是把bedroom_light以引用方式捕获到lambda中,确保在lambda里调用成员函数时,操作的是原对象本身。
  • 单独写&不符合lambda的语法规范,编译器会直接报错,因为它无法识别这是lambda的捕获列表。

和std::bind的对比

你熟悉的std::bind(&Light::on, bedroom_light)是把成员函数和对象绑定成一个可调用对象,而lambda是直接定义一个匿名函数,逻辑更直观。当需要执行的逻辑不止一行代码时,lambda的可读性和灵活性远高于std::bind。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:12:06