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]

C++11 STL Lambda表达式

 

 

 mutable的作用:

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

C++11 STL Lambda表达式

 

 上述行为可视为:

    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;
}

 

原文链接: https://www.cnblogs.com/xiaoaofengyue/p/12853819.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++11 STL Lambda表达式

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/347078

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午4:19
下一篇 2023年3月2日 上午4:19

相关推荐