c++11匿名函数Lambda

定义一个lambda函数:

auto f = [capture](params)opt->ret{body;} ;
f(); //调用函数

其中:

  1. capture表示捕获函数作用域外的外部变量
  2. params是参数(非必须)
  3. opt是函数选项,例如可选择是否允许更改capture到的外部变量
  4. ret表示函数返回类型,一般可以免了,因为我们在f前面用了auto
  5. body是函数体

例子:

int main()
{
    int a1 = 1, a2 = 3, a3 = 4;
    auto f1 = [a1](int b){return a1+b;}; //按值捕获外部变量a1, 函数参数是b,返回a+b
    cout << f1(4) << endl;               //输出:5
    
    auto f2 = [=](int b){return a1+a2+a3+b;}; //按值捕获所有外部变量, 函数参数是b,返回所有外部变量和b的和
    cout << f2(4) << endl;                    //输出:10
    
    auto f3 = [&](int b){return a1+a2+a3+b;}; //按引用捕获所有外部变量, 函数参数是b,返回所有外部变量和b的和
    a1 = 2;
    cout << f3(4) << endl;                    //输出:11
    
    auto f4 = [&,a3](int b){return a1+a2+a3+b;}; //按值引用a3并按引用捕获其它外部变量, 返回所有外部变量和b的和
    a3 = 2;
    cout << f4(4) << endl;                       //输出:10

    auto f5 = [&]{return a1++;};           //错误:所有外部变量复制都是const的,不能修改;
    auto f5 = [&]()mutable{return a1++;};  //OK:加了mutable选项后外部变量可以修改;
}

class A 
{
private:
	int val;
public:
	auto f = []{return val;};     //错误:没有捕获任何变量
	auto f = [this]{return val;}; //OK: 捕获当前类的this指针,故能访问val
}

猜你喜欢

转载自blog.csdn.net/weixin_43762200/article/details/85264575
今日推荐