lambda
Lambda
- lambda 表达式
仅仅是一个表达式,例如
std::find_if(container.begin(),container.end(), [](int val) {return 0 < val && val < 10;} );
中的
[](int val) {return 0 < val && val < 10;}
-
lambda创建的运行时对象,这个对象是一个闭包 (closure)。例如在上面代码std::find_if中这个closure是一个对象被作为第三个参数传递到std::find_if里。
-
一个闭包类(closure class),实例化一个闭包。每个lambda都会引起编辑器生成一个闭包类,lambda里面的语句成为闭包类成员函数的执行语句。
int x; //x is local variable
auto c1 = [x](int y) {return x * y > 55;}; //c1 is copy of the closure produeced by the lambda
auto c2 = c1; //c2 is copy of c1
auto c3 = c2;
c1,c2,c3都是lambda创建的闭包的副本。
capture modes
two default capture modes in c++ 11:by-reference and by-value.
- [] 空没有使用任何函数对象参数。
- [=] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
- [&] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
- [this] 函数体内可以使用Lambda所在类中的成员变量。
- [a] 将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
- [&a] 将a按引用进行传递。
- [a, &b] 将a按值进行传递,b按引用进行传递。
- [=,&a, &b] 除a和b按引用进行传递外,其他参数都按值进行传递。
- [&, a, b] 除a和b按值进行传递外,其他参数都按引用进行传递。
using FilterContainer = std::vector<std::function<bool(int)> >;
FilterContainer filters;
class Widget
{
public:
void addFilter()const
{
filters.emplace_back([=](int value) {return value % divisor == 0; });
}
private:
int divisor;
};
filters.emplace_back([](int value) {return value % divisor == 0; });
上面这个语句是编译不过的,因为在addFilter函数里没有divisor这个变量,这个变量是属于类Widget的。
filters.emplace_back([=](int value) {return value % divisor == 0; });
编译过是以为他传递的this,相当于:
void Widget::addFilter()const{
auto currentObjectPtr = this;
filter.emplace_back(
[currentObjectPtr](int value)
{
return value%currentObjectPtr->divisor == 0;
}
);
}
posted on 2021-05-19 17:03 Ultraman_X 阅读(58) 评论(0) 编辑 收藏 举报