C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。

  1. 1.Lambda表达式完整的声明格式如下:
  2. [capture list] (params list) mutable exception-> return type { function body }
  3. 各项具体含义如下
  4. capture list:捕获外部变量列表
  5. params list:形参列表
  6. mutable指示符:用来说用是否可以修改捕获的变量
  7. exception:异常设定
  8. return type:返回类型
  9. function body:函数体

[] // 不捕获任何外部变量

[=]// 以值的形式捕获所有外部变量

[&] // 以引用形式捕获所有外部变量

[x, &y] // x 以传值形式捕获,y 以引用形式捕获

[=, &z]// z 以引用形式捕获,其余变量以传值形式捕获 [&, x]

// x 以值的形式捕获,其余变量以引用形式捕获

例如: float f0 = 1.0; std::cout << [=](float f) { return f0 + std::abs(f); } (-3.5);

其输出值是 4.5。[=] 意味着,lambda 表达式以传值的形式捕获同范围内的变量。

另外一个例子: float f0 = 1.0; std::cout << [&](float f) { return f0 += std::abs(f); } (-3.5); std::cout << '\n' << f0 << '\n';

输出值是 4.5 和 4.5。

[&] 表明,lambda 表达式以传引用的方式捕获外部变量。

那么,下一个例子:

float f0 = 1.0;

std::cout << [=](float f) mutable { return f0 += std::abs(f); } (-3.5);

std::cout << '\n' << f0 << '\n';

注意:尾部的(),这对括号使得这个lambda表达式立即执行:

[] {cout << "Hello from Lambda" << endl; } ();

string result = [](const string & str) -> string { return "Hello from " + str; }("second Lambda");

cout << "Result: " << result << endl;

Result: Hello from second Lambda

4.5 和 1.0。为什么 f0 还是 1.0?因为我们是传值的,虽然在 lambda 表达式中对 f0 有了修改,但由于是传值的,外部的 f0 依然不会被修改。

如果我不想让 lambda 表达式自动推断类型,或者是 lambda 表达式的内容很复杂,不能自动推断怎么办?比如,std::abs(float)的返回值是 float,我想把它强制转型为 int。那么,此时,我们就必须显式指定 lambda 表达式返回值的类型:

std::cout << [](float f) -> int { return std::abs(f); } (-3.5);

参考:https://blog.csdn.net/qs9816/article/details/8888366

最新文章

  1. SMARTY模板中如何使用get,post,request,cookies,session,server变量
  2. compass tables 表格 表格常见样式[Sass和compass学习笔记]
  3. python3+ 模块学习 之 subprocess
  4. XML中特殊字符转义
  5. js this 闭包
  6. C++中delete和delete[]的区别
  7. Pytorch windows10安装教程
  8. Redis持久化存储
  9. LeetCode算法题-Self Dividing Numbers(Java实现)
  10. 洛谷P1122最大子树和题解
  11. [Swift]LeetCode371. 两整数之和 | Sum of Two Integers
  12. 移动端开发:使用jQuery Mobile还是Zepto
  13. day 30 1.操作系统原理 2. Process 模块学习
  14. STL-queue和循环队列基本操作的实现
  15. day 12 内置函数,装饰器,递归函数
  16. Redis源代码分析(三十三)--- redis-cli.cclient命令行接口的实现(2)
  17. PostgreSQL PITR实验
  18. HTTP Cookie 详解
  19. 在js中获取页面元素的属性值时,弱类型导致的诡异事件踩坑记录,
  20. vs2017中的scanf_s

热门文章

  1. Splay树简单操作
  2. luogu1402 酒店之王
  3. Marriage Match IV HDU - 3416
  4. [BZOJ2002] [Hnoi2010] Bounce 弹飞绵羊 (LCT)
  5. C++学习-4
  6. asp.net core 四 IOC&amp;DI Autofac
  7. java创建运行以及项目结构
  8. Android开发从GC root分析内存泄漏
  9. Android Service 基础
  10. poj-1503-java大数相加