美文网首页
lambda 小结

lambda 小结

作者: gpr | 来源:发表于2016-06-05 01:07 被阅读97次

lambda 结构

[capture_block](parameters) mutable exception_specification->return_type{ body }
  • catpure block: 指定如何捕捉所在作用域中的变量,并供给lambda主体使用
  • parameter: 可选, lambda表达式使用的参数列表。
  • mutable: 可选, 如果所在作用域的变量是通过值捕捉到,那么lambda表达式主体中可以使用这些变量的副本。这些副本默认标记为const,因此lambda表达式的主体不能修改这些副本的值。如果lambda表达式标记为mutable,那么这些副本则不是const,因此主体可以修改这些本地副本。
  • exception_specification:(可选)用于指定lambda可以抛出的异常。
  • return_type:(可选)返回值的类型。如果忽略了return_type,那么编译器会根据以下原则判断返回类型:
    如果lambda表达式主体的形式为{return expression;}
    那么表达式return_type的类型为expression的类型。
    其他情况下的return_type为void

Hello lambda

// 注意 尾部 () 表示立马执行
std::string str = []{ return "Hello lambda"; }();
std::cout<< str << std::endl;
    
auto fn = [](const std::string &str){ return "Hello " + str; };
    
std::cout << fn("fn1") << std::endl;
std::cout << fn("fn2") << std::endl;

捕捉块

lambda表达式的方括号部分称为lambda捕捉块(capture block),在这里可以指定如何从所在作用域中捕捉变量。捕捉变量的意思是可以在lambda表达式主体中使用这个变量。有两种方式:
[=]:通过值捕捉所有变量
[&]:通过引用捕捉所有变量
指定空白的捕捉块[]表示不从所在作用域中捕捉变量。还可以酌情决定捕捉那些变量以及这些变量的捕捉方法,方法是指定一个捕捉列表,其中带有可选的默认捕捉选项。前缀为&的变量通过引用捕捉。不带前缀的变量通过值捕捉。默认捕捉应该是捕捉列表中的第一个元素,可以是=或&。
例如:
[&x]只通过引用捕捉x,不捕捉其他变量。
[x]只通过值捕捉x,不捕捉其他变量。
[=, &x, &y]默认通过值捕捉,变量x和y例外,这两个变量通过引用捕捉。
[&, x]默认通过引用捕捉,变量x例外,这个变量通过引用捕捉。
[&x, &y]非法,因为标志符不允许重复。
通过引用捕捉变量的时候,一定保证党lambda表达式在执行的时候,这个引用还是可用的

// 通过值来捕捉
std::function<int(void)> mutiplyBy2Lambda(int x)
{
    return [=](){ return x * 2; };
}

// 通过引用来捕捉
std::function<int(void)> mutiplyBy3Lambda(int x)
{
    // 当函数结束的时候 x 的内存就会被释放, 因此这样的做法是有问题
    return [&](){ return x * 2; };
}

int main(int argc, const char * argv[])
{
    // 打印结果: 4
    auto fn = mutiplyBy2Lambda(2);
    std::cout << fn() << std::endl;
    
    // 打印结果: 随机值
    auto fn3 = mutiplyBy3Lambda(2);
    std::cout << fn3() << std::endl;
    
    
    int i = 2;
    // 打印结果: 9
    auto tFn3 = [&]{ return 3 * i; };
    // 打印结果: 4
    auto tFn = [=] { return 2 * i; };
    
    i++;
    
    std::cout << "i = " << i << std::endl;
    std::cout << "tFn3() = " << tFn3() << std::endl;
    std::cout << "tFn() = " << tFn() << std::endl;
    return 0;
}

转自: http://blog.csdn.net/xuexiacm/article/details/39835085

相关文章

  • lambda 小结

    lambda 结构 catpure block: 指定如何捕捉所在作用域中的变量,并供给lambda主体使用 pa...

  • Lambda知识点小结(1)

    javase1.8以后的新特性 Lambda (参数类型可以省略) (参数名称)->{ 功能代码} 知识点小结 主...

  • Sarsa(Lambda)-Sarsa升级版

    目录 前言 单步更新和回合更新 算法公式 探险者上天堂实战 小结 前言 今天介绍的Sarsa(lambda)算法是...

  • 二,Kotlin之Lambda表达式详解

    概览 Lambda介绍 Lambda使用Lambda表达式的特点Lambda语法 Lambda实践it下划线(_)...

  • JDK8新特性

    Lambda语法 Lambda是什么? "Lambda表达式"(Lambda expression)是一个匿名函数...

  • java8利用lambda表达式来封装jedis的连接池资源

    lambda表达式 什么是lambda? “Lambda 表达式”(lambda expression)是一个匿名...

  • 2020-07-04【Lambda】

    Lambda标准格式 Lambda省略模式 Lambda注意事项 Lambda表达式和匿名内部类的区别

  • Java8-Lambda&Stream

    Lambda 案例1 lambda替换匿名类 案例2 lambda对list进行迭代 案例3 lambda表达式内...

  • C++ lambda表达式

    lambda表达式 目录 一、开篇 二、lambda初识 三、lambda基本用法 四、lambda表达式捕获列表...

  • java8 lambda-9-小结

    我们在设计lambda时的一个重要目标就是新增的语言特性和库特性能够无缝结合(designed to work t...

网友评论

      本文标题:lambda 小结

      本文链接:https://www.haomeiwen.com/subject/fvzldttx.html