【C++11学习】Lambda表达式

基本语法

[capture list] (parameter list) ->return type { function body }
  • [capture list]: 捕捉说明符,表示一个Lambda的开始。可为空。
  • (parameter list):参数列表。可省略
  • return type:返回类型(int,doule……)。可省略
  • function body:函数体。

使用Lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多。
例子1

void test1()
{
    cout << "hello world" << endl;
}
void main()
{
    auto test2 = [](){cout << "hello world" << endl;};
    test1();
    test2();
    system("pause");
}

在Lambda表达式中获得xy的值,但是不可以改变它们的值。
例子2

    int x = 1, y = 2;
    auto test = [x, y] {return x > y; };
    cout << test() << endl;

在Lambda表达式中获得xy的值,并改变它们的值。
例子3

    int x = 1, y = 2;
    auto test = [&x, &y]
     {
        y++;
        return x += y;
     };
    cout << test() << endl;
    cout << y << endl;

以下是捕捉说明符的用法

  • [] 不截取任何变量
  • [foo] 截取foo变量并且拷贝一份在函数体重使用
  • [&} 截取外部作用域中所有变量,并作为引用在函数体中使用
  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
  • [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
  • [x, &y] x按值传递,y按引用传递
  • [this] 以值的方式捕获 this 指针

Lambda表达式有一个很有意思的事情就是,按值传递【foo】的时候值在声明Lambda那一刻就已经确定了,无论怎样后面怎样修改都无法改变。
例子4

    int a = 1, b = 2;
    auto test = [&a,b]
     {
     cout << "a = " << a << endl; 
     cout << "b = " << b << endl; 
     };
    a = 100, b = 99;
    test();

结果是 a = 100 , b = 2。

对于 ->return type
例子5

    int a = 1;
    auto test = [a]()->double {return a; };
    cout << "sizeof(int) = " << sizeof(int) << endl;
    cout << "sizeof(test()) = " << sizeof(test()) << endl;

返回结果是

    sizeof(int) = 4
    sizeof(test()) = 8

一目了然了,对不对。

修饰说明符 mutable
例子6

    int a = 1;
    auto test = [a]() mutable { return ++a; };
    cout <<test() << endl;

结果为 2。

mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。
在C++语言中,是使用较少的关键字——如果一个函数被const 修饰,那么它将无法修改其成员变量的,但是如果这个成员变量是被mutable修饰的话,则可以修改。

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值