C++11 STL Lambda表达式

语法如下:

//直接调用
[]{
    cout<<"hello lambda1"<<endl;
}();

//传递给对象
auto l=[]{
    cout<<"hello lambda2"<<endl;
};
l();

Lambda可以有参数

auto l2 = [](const string& s){
    cout<<"s: "<<s<<endl;
};
l2("hello lambda3");

Lambda 可以返回某物。但不需要指明返回类型。该类型会根据返回值被推导出来。

如果想指明一个返回类型,可使用新式C++语法。

int a = [] {
    return 42;
}();
cout<<"a="<<a<<endl;

double b = [] () -> double {
    return 43;
}();
cout<<"b="<<b<<endl;

方括号内,可以指明一个capture用来处理外部作用域内,未被传递为实参的数据

[=]表示外部作用域的以by value的方式传递给lambda。Lambda内修改变量不会改动外部作用域的数据。

[&]表示外部作用域的以by reference的方式传递给lambda。Lambda内修改变量会改动外部作用域的数据。

int x=0,y=42;
auto qqq=[x,&y]{
    cout<<"x: "<<x<<endl;
    cout<<"y: "<<y<<endl;
    y++;
};
x=y=77;
qqq();
qqq();
cout<<"final y: "<<y<<endl;

以上的代码也可以用 [=, &y]取代 [x,&y]

 

 

 mutable的作用:

    int id=0;
    auto f1=[id]()mutable{
        cout<<"id :"<<id<<endl;
        ++id;
    };
    id=42;
    f1();
    f1();
    f1();

 

 上述行为可视为:

    class{
    private:
        int id;
    public:
        void operator ()(){
            cout<<"id :"<<id<<endl;
            ++id;
        }

    };

Lambda类型。

Lambda类型是个匿名function object。如果想根据该类型声明对象。可借助template或auto。如果实在需要写下该类型,可使用decltype()。或者使用std::function<> class template。

#include <iostream>
#include <functional>

std::function<int(int,int)> returnLambda(){
    return [](int x,int y){
        return x*y;
    };
}

int main(){
    auto lf=returnLambda();
    cout<<"lf(5,7)="<<lf(5,7)<<endl;
    return 0;
}

 

posted @ 2020-05-08 23:36  啸傲风月  阅读(530)  评论(0编辑  收藏  举报