cpp的lambda和bind
基本表达式
[capture](parameters) -> return-type {body}
当没有返回类型时, 可以省略 -> return-type
变量捕获与lambda闭包实现
[]
不截取任何变[&]
截取外部作用域中所有变量,并作为引用在函数体中使用[=]
截取外部作用域中所有变量,并拷贝一份在函数体中使用[=, &foo]
截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用[bar]
截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量[x, &y]
x按值传递,y按引用传递[this]
截取当前类中的this指针。如果已经使用了&
或者=
就默认添加此选项。
lambda 的底层实现
lambda 其实是c++的语法糖,是通过c++编译器生成class来实现的,看一个简单的例子。
#include <functional>
using namespace std;
int main(int argc, char* argv[]) {
int x = 0;
int y = 0;
int z = 0;
auto func = [&](int a)->int{x+=a; y++; return x;};
func(1);
return 0;
}
通过cppinsights 站点来查看编译器的实现方法
#include <functional>
using namespace std;
int main(int argc, char** argv) {
int x = 0;
int y = 0;
int z = 0;
class __lambda_8_16 {
public:
inline /*constexpr */ int operator()(int a) const {
x = x + a;
y++;
return x;
}
private:
int& x;
int& y;
public:
__lambda_8_16(int& _x, int& _y) : x{_x}, y{_y} {}
};
__lambda_8_16 func = __lambda_8_16{x, y};
static_cast<const __lambda_8_16>(func).operator()(1);
return 0;
}
匿名函数在编译器中生成了类 class __lambda_6_16
,其中operator()
中使用了x和y,参数是引用传参。