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编辑  收藏  举报

导航