lambda相当于一个匿名函数一样使用
但是它并非是匿名函数,编译器会为我们生成一个类,lambda的类,如果用auto接实际上返回的是一个函数对象
我们今天详细讲一下lambda的捕获

#include<iostream>
class Demo {public:Demo(int i):m(i){}void operator()() {[this] {std::cout << m << std::endl; }();}void demo(int a) {[=,this] { this->m = a; }();//有所不同的是只需要this就可以修改成员变量的值了}void test() {[this] {this->m = 111; }();   //其实加不jia=都可以直接改变成员变量,但是没用=捕获的话没办法获取传入的值,不能像上面那样}
private:int m = 0;
};
int main() {//当不接收参数的时候可以省略(),最后加上()是为了调用,下面这些产生的结果是一样的,至少在目前是的std::cout << [] { return 5; }() << std::endl;std::cout << []()->decltype(auto) {return 5; }() << std::endl;std::cout << []()->int {return 5; }() << std::endl;std::cout << []()->auto {return 5; }() << std::endl;int a = 0;//或者接收参数auto p = [](int b) {std::cout << b << std::endl; };p(a);auto p2 = [](auto b) {std::cout << b << std::endl; };p2(a);//或者直接捕获 下面的区别无非是捕获整个作用域和捕获具体的变量[=] {std::cout << a << std::endl; }();[i = a] {std::cout << i << std::endl; }();//或者直接修改[&] {a = 100; std::cout << a << std::endl; }();[&a] {a = 100; std::cout << a << std::endl; }();[ca=std::as_const(a)] ()mutable {ca = 10; std::cout << ca << std::endl; }();std::cout << a << std::endl;//下面这是在类内的捕获情况Demo demo(10);demo();demo.demo(123);demo();demo.test();//这种方式是无法改变成员变量的值的demo();//其实还有很多操作,最后补充一下,可以像下面这样int e(0), f(0), g(0);[E = e, F = f, G = g] {std::cout << E << ' ' << F << ' ' << G << std::endl; }();[&E = e, &F = f, &G = g] {E = 1, F = 2, G = 3; std::cout << E << ' ' << F << ' ' << G << std::endl; }();std::cout << e << ' ' << f << ' ' << g << std::endl;//另外,不省略()然后->指定类型啥的其实都行,如果是引用捕获的时候()mutable的话也合法,虽然没啥区别,先这样,语法糖而已return 0;
}

我们顺便再提一下C++14提出的可以在lambda内使用auto
简单的说就是能给lambda的形参类型写成auto演示如下

#include<iostream>
#include<string>
#include<array>
#include<algorithms>
/*在C++14 中引入的泛型lambdas,是一种成员模板的简化。对于一个简单的计算两个任意类
型参数之和的lambda:*//*
[](auto x, auto y) {return x + y;
}
*/
//编译器会默认为它构造下面这样一个类:
class SomeCompilerSpecificName {public:SomeCompilerSpecificName(){}; // 构造函数只能由编译器调用template<typename T1, typename T2>auto operator() (T1 x, T2 y) const {return x + y;}
};
int main()
{int x = 2;double y = 3.2,i=3.4;auto fool = [=](auto x, auto y) {return x + y; };std::cout << typeid(fool).name() << std::endl;std::cout << fool(x, y) << std::endl;//5std::cout << fool(x, i) << std::endl;//5.4return 0;
}
//下面是一个实际使用的例子
void test01() {std::array<std::string, 2>str{ "111","222" };std::for_each(std::begin(str), std::end(str), [](auto i) {std::cout << i << ","; });
}
void test02() {int num[5]{ 1,2,3,4,5 };std::for_each(std::begin(num), std::end(num), [](auto i) {std::cout << i << ","; });
}
int main()
{test01();test02();return 0;
}

关于泛型lambda,它的原理我们就先不介绍了,会用即可,说起来也麻烦
如果感兴趣的话可以看看我详细写的文章


视频讲解

还是很简单的 多用即可

如果还想深入了解可以看博主的几篇别的lambda文章,比如https://blog.csdn.net/a4364634611/article/details/127865918

C++lambda 捕获相关推荐

  1. lambda捕获this_非捕获Lambda的实例

    lambda捕获this 大约一个月前,我在Java 8的lambda表达式框架下总结了Brian Goetz的观点 . 目前,我正在研究有关默认方法的文章,令我惊讶的是,我又回到了Java处理lam ...

  2. C++ lambda 捕获模式与右值引用

    lambda 表达式和右值引用是 C++11 的两个非常有用的特性. lambda 表达式实际上会由编译器创建一个 std::function 对象,以值的方式捕获的变量则会由编译器复制一份,在 st ...

  3. C++ Primer 5th笔记(10)chapter10 泛型算法 :lambda

    1. 定义 lambda表达式表示一个可调用的代码单元. 一个lambda具有捕获列表.参数列表,返回类型,函数体: [capture list](parameter list)->return ...

  4. c++中lambda表达式用法

    lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象,并且使代码更可读. 所谓函数对象,其实就是对operator()进行重载进 ...

  5. 快用一用 lambda 表达式吧,让你的代码更简洁、更漂亮!

    目录 lambda 表达式 定义 lambda 表达式 捕获子句 按值捕获 按引用捕获 捕获特定的变量 捕获this指针 结合 lambda 使用 STL 算法 lambda 表达式 lambda 表 ...

  6. aws lambda_如何为AWS Lambda实施日志聚合

    aws lambda by Yan Cui 崔燕 如何为AWS Lambda实施日志聚合 (How to implement log aggregation for AWS Lambda) Dur­i ...

  7. lambda表达式浅析【C++学习笔记】

    lambda表达式浅析[C++学习笔记] 基本用法: auto f = [/*捕获列表*/](/*参数*/)->int /*后置返回值类型*/{/** 函数体*/}; 捕获列表: [] : 不捕 ...

  8. 泛型算法(lambda表达式、function类模板、bind函数适配器、迭代器类别、链表数据结构独有的算法)

    文章目录 概念 find()函数 迭代器令算法不依赖于容器 但算法依赖于元素类型的操作 算法永远不会执行容器的操作 只读算法 accumulate()函数 从两个序列中读取元素(equal函数为例) ...

  9. 定制操作(传递函数或lambda表达式)

    很多算法都会比较输入序列中的元素.默认情况下,这类算法使用元素类型的<或==运算符完成比较.标准库还为这些算法定义了额外的版本,允许我们提供自己定义的操作来代替默认运算符. 例如,sort算法默 ...

最新文章

  1. HTTP1.0和HTTP1.1区别
  2. [Logstash-input-redis] 使用详解
  3. android Fragments详解
  4. Atom与markdown
  5. 使用RichTextBox控件实现系统剪切板功能
  6. grep/egrep和正则表达式汇总
  7. java的位置_Java中数据存放的位置
  8. 深度学习(1)---2017年深度学习NLP重大进展与趋势
  9. 5G人才平均月薪水涨船高!通信研发工程师需求最旺
  10. Mysql索引的类型
  11. 计算机excer试题,计算机电子表格excel练习题
  12. Informatic学习总结_day01
  13. 王刚日记:写文章和赚钱之间的关系
  14. java点赞判断恶意点击_重庆网络营销教你使用对恶意点击的必杀技!
  15. 安卓系统API的使用
  16. 能上QQ,不能上网的解决方法
  17. 看不懂英文文献,怎么写论文?
  18. 毕业设计—共享图书小程序3.0 全新UI
  19. 2023前端面试总结含参考答案
  20. Ansys Zemax / SPEOS | 光源文件转换器

热门文章

  1. ?软件测试mysql面试题:varchar(50)中50的涵义?
  2. 东北大学计算机学硕复试分数线,2020年东北大学学硕复试分数线
  3. xcode will continue when iPhone is finished iPhone is busy:Processing symbol files
  4. R报:不存在叫‘data.table’这个名字的程辑包,以及:‘data.table’ These will not be installed之类问题的解决方法
  5. 众口难调的网站导航条
  6. Jquery中next()方法与prev()方法的使有和详解
  7. Java | 二维数组的初始化
  8. hibernate 多对多代码
  9. 2014年计算机专业硕士研究生好就业吗?一位计算机专业硕士毕业生的求职经历和感想
  10. CCIE知识点总结——组播