lambda表达式

lambda表达式

介绍

一个lambda表达式表示一个可调用的代码单元,可以将其理解为一个未命名的内联函数。形式为

[capture list](parameter list) -> return type { function body}
//必须使用尾置返回

几个特点

  • 必须使用尾置返回
  • 在创建时捕获
  • 只有一行return语句时可省略返回类型,否则默认为void
  • 一般在给算法传递谓词时可以使用

lambda表达式的捕获

  • 值捕获
void fun1()
{
    size_t v1 = 21;
    auto f = [v1]{return v1;}; //省略了参数列表
    v1 = 0;
    cout << f();
}

输出21

  • 引用捕获
void fun2()
{
    size_t v2 = 21;
    auto f2 = [&v2] {return v2;};
    v2 = 0;
    cout << f2();
}

将输出0

  • 隐式捕获
    只在捕获列表里加=(值)或者&(引用),由编译器来推断
void fun3()
{
    size_t v3 = 21;
    auto f3 = [&] {return v3;};
    v3 = 0;
    cout << f3();
}

输出0

  • 混合捕获
    即在捕获列表开始使用=或者&隐式捕获,再对不同的捕获变量使用显式捕获。此显式捕获必须与开始的隐式捕获不同(值或引用)

mutable

对于值捕获,lambda表达式不能改变捕获的参数,如

void fun4()
{
    size_t v4 =21;
    auto f4 = [=] (int i)  {return (++v4) + i;};
    cout << endl << f4(9);
}

编译错误

error: increment of read-only variable 'v4'|

可以在参数列表后面加mutable,同时即使没有参数,参数列表也不能省略了。

void fun4()
{
    size_t v4 =21;
    auto f4 = [=] (int i) mutable {return (++v4) + i;};
    cout << endl << f4(9);
}

而用引用捕获时就不需要了

void fun4()
{
    size_t v4 =21;
    auto f4 = [&] (int i)  {return (++v4) + i;};
    cout << endl << f4(9);
}

返回

当函数体不是只有一条return语句时需要指定返回类型,且必须用尾置返回类型。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C++ lambda表达式与函数对象 lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以...
    小白将阅读 85,522评论 15 117
  • 前段时间一直在看lambda表达式,但是总感觉吃不透,在深入了解lambda表达式的时候,需要很多基础的知识栈。这...
    西瓜真好吃丶阅读 7,607评论 0 7
  • 根据算法接受一元谓词还是二元谓词,我们传递给算法的谓词必须严格接受一个或两个参数。但是,有时我们希望进行的操作需要...
    学习编程好少年阅读 5,583评论 1 0
  • 简介 概念 Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主...
    刘涤生阅读 8,430评论 5 18
  • 转载自:《深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)》——Luci...
    琦小虾阅读 3,996评论 0 5