如何正确理解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
相关产品推荐
相关产品推荐

