C++ Lambda表达式

2021-01-26 07:16

阅读:725

标签:value   capture   auto   img   需要   operator   http   根据   直接   

语法如下:

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

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

Lambda可以有参数

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

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

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

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

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

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

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

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

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

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

技术图片

 

 

 mutable的作用:

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

技术图片

 

 上述行为可视为:

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

    };

Lambda类型。

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

#include 
#include 

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

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

 

C++ Lambda表达式

标签:value   capture   auto   img   需要   operator   http   根据   直接   

原文地址:https://www.cnblogs.com/xiaoaofengyue/p/12853819.html


评论


亲,登录后才可以留言!