这几天在看 C++ 的 lambda 表达式,挺有意思,这个标准是在 C11标准 加进去的,也就是 2011 年,相比 C# 2007 还晚了个 4 年, Lambda 这东西非常好用,会上瘾,今天我们简单聊一聊。

一:语法定义

首先我们看下 C++ 语法定义格式:

[capture] (parameters) mutable ->return-type{statement}

相比 C# lambda 的语法格式:

(parameters) => {return-type statement}

要复杂一些,之所以复杂还是因为 C++ 让程序员用的必须更谨慎一些。

二:谨慎在哪里?

为了说明更谨慎在哪里,我们上一个简单的例子。


int main() { int a = 1;
int b = 2; auto func = [](int c) -> void { cout << "input:" << c << endl;
}; func(10); return 0;
}

上面就定义了一个原子化的 lambda 函数,在现实开发中往往不仅要获取参数,还要获取 外部作用域 的变量,比如说,我想计算 a+b+c 的结果,接下来稍微改一下代码:

可以看到,居然给报错了,在 C# 中可是一点问题都没有。

1. 谨慎1 :屏蔽外部所有作用域变量

C++ 默认屏蔽所有的外部作用域值,这么做大概率还是想让程序员知道自己的意图,这相比 C# 要严谨的多,算是喜忧参半吧。

那如何让 C++ 代码通过呢? 这就需要用到语法格式中的 [capture] 部分,简而言之就是需要告诉编译器打开栅栏放哪些变量进来,比如 =,&,两者都可以访问所有的外部作用域变量,不同的是前者是 按传值方式,后者 按引用方式

  1. 按值方式

有了思路后,修改代码如下:


int main() { int a = 1;
int b = 2; auto func = [=](int c) -> void { auto sum = a + b + c; cout << "sum:" << sum << endl;
}; func(10); return 0;
}

哈哈,这个问题我们完美搞定。

  1. 按引用方式

大家都知道,按引用 传的是地址,言外之意就是可以做到 原地修改,接下来我们修改下代码。


int main() { int a = 1; auto func1 = [&]() -> void { a = 10;
}; func1(); cout << "a =" << a << endl; return 0;
}

谨慎2:屏蔽所有按值传递的修改

为了方便说明,我们先看图:

可以看到,按值传递进来的值都是无法修改的,这么做主要还是怕程序员弄混了,如果一定要让代码通过,就需要增加语法格式中的 mutable 项,本质上就是踢掉默认的 const ,这样在方法体中就可以修改 a 变量,修改代码如下:


int main() { int a = 1; auto func1 = [=]() mutable -> void { a = 10;
}; func1(); cout << "a =" << a << endl; return 0;
}

哈哈,成功修改,当然语句够简单的话,还可以将下面的代码:


auto func1 = [&]() -> void { a = 10;
};

修改成如下:


auto func1 = [&]() { a = 10;
};

关于作用域方面还有很多好玩的,比如只放某一个变量进来。

总体上来说,C++ 的 lambda 的格式相比 C# 更严谨,反过来说就是不太相信 C++ 程序员有能力用好。,好了,本篇就聊这么多,希望对你有帮助。

最新文章

  1. 最长公共子序列LCS问题
  2. 【温故而知新-Javascript】使用事件
  3. IOS开发-视频,音频,录音简单总结
  4. mysql聚合函数
  5. PHP中数组转换为XML格式
  6. css圆角
  7. Leetcode::JumpGame
  8. 04_Javascript初步第三天
  9. 硬盘GPT分区与MBR分区的转换
  10. java集合的contains(obj)方法的实现
  11. 获取OlapConnection连接
  12. Docker 概览
  13. vue中怎么实现获取当前点击对象this
  14. 跨平台技术实践案例: 用 reactxp 重写墨刀的移动端
  15. 背水一战 Windows 10 (120) - 后台任务: 后台上传任务
  16. Join The Future (剪枝 + 状态压缩)
  17. Jmeter(二十一)Jmeter常见问题及场景应用
  18. HDU 2647 Reward(拓扑排序,vector实现邻接表)
  19. Windows10 命令行中使用网络驱动器
  20. 2018-2019赛季最后的随想/$\rm{NOIP2018}$游记&#183;启示录

热门文章

  1. 整合SSM框架环境搭建
  2. linux升级Nginx1.6到Nginx1.12.2
  3. Python BeautifulSoup4 爬虫基础、多线程学习
  4. Java 图像处理(一)
  5. JAVA语言学习day16--7月22日
  6. 2021.08.05 P1340 兽径管理(最小生成树)
  7. No value specified for 'Date' BeanUtils.copyProperties 日期为空 转型错误
  8. 用 GraphScope 像 NetworkX 一样做图分析
  9. 为何数据库连接池不采用IO多路复用?
  10. .NET 程序读取当前目录避坑指南