博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ | Lambda表达式 | 语法分析
阅读量:4141 次
发布时间:2019-05-25

本文共 1679 字,大约阅读时间需要 5 分钟。

文章目录

1 参考

2 什么是Lambda?

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

  • Lambda 的语法形式如下:
[函数对象参数 capture list] (操作符重载函数参数 parameter list) mutable 或 exception 声明 -> 返回值类型 return type {
函数体 function body}
  • 常见形式:
//降序排序sort(a, a+n, [](int a,int b){
return a>b;});//大顶堆auto cmp = [&](const char& letter1, const char& letter2) {
return counts[letter1 - 'a'] < counts[letter2 - 'a'];};priority_queue
, decltype(cmp)> queue{
cmp};//求和vector
some_list;int total = 0;for (int i = 0; i < 5; ++i) some_list.push_back(i);for_each(begin(some_list), end(some_list), [&total](int x){
total += x;});

3 Lambda语法分析

3.1 函数对象参数 [capture list]

标识一个 Lambda 表达式的开始(必须存在)。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义 Lambda 为止时,Lambda 所在作用范围内可见的局部变量(包括 Lambda 所在类的 this)。函数对象参数有以下形式:

[] : 空。没有任何函数对象参数。[=] : =。函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。[&] : &。函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this),并且是引用传递方式(相当于是编译器自动为我们按引用传递了所有局部变量)。[this] : this。函数体内可以使用 Lambda 所在类中的成员变量。a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的 a的拷贝,因为默认情况下函数是const的,要修改传递进来的拷贝,可以添加 mutable 修饰符。[&a] : &a。将 a 按引用进行传递。[a,&b] : a,&b。将 a 按值传递,b按引用进行传递。[=,&a,&b] : =,&a,&b。除a和b按引用进行传递外,其他参数都按值进行传递。[&,a,b] : &,a,b。除a和b按值进行传递外,其他参数都按引用进行传递。

3.2 操作符重载函数参数 (parameter list)

标识重载的 () 操作符的参数,没有参数时,这部分可以省略。参数可以通过按值(如: (type a, type b))和按引用 (如: (type &a, type &b)) 两种方式进行传递。

3.3 mutable 或 exception 声明

这部分可以省略。按值传递函数对象参数时,加上 mutable 修饰符后,可以修改传递进来的拷贝(注意是能修改拷贝,而不是值本身)。exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)

3.4 -> 返回值类型

标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。

3.5 函数体 {function body}

标识函数的实现,这部分不能省略,但函数体可以为空。

转载地址:http://pzevi.baihongyu.com/

你可能感兴趣的文章
那一年, 我第一次在工作中用到了三次握手的分析
查看>>
什么情况下,发送端的send函数成功, 但发送端抓不到对应的网络包?------深入理解send函数
查看>>
在tcp半开连接(也就是死连接)上send数据, send函数会成功吗? 后续会怎样?
查看>>
tcp四次挥手中FIN_WAIT2状态的最大时间是多长?
查看>>
tcp四次挥手中LAST_ACK状态一般持续多久?
查看>>
socket I/O上设置超时的三种方法及其比较
查看>>
居然很少有人质疑: 2MSL的TIME_WAIT时间真的足够保证旧连接上的所有包都消失吗?
查看>>
正确理解tcp的可靠传输------其实并不100%可靠
查看>>
readn和writen函数一览------顺便说说recv函数的MSG_WAITALL参数
查看>>
聊聊tcp四次挥手中的TIME_WAIT状态存在的理由
查看>>
shutdown能做哪些close做不了的事?
查看>>
工作四年的一些经历和感悟------在扯淡的世界中尽力而为
查看>>
僵尸进程示例分析------顺便说说linux中的wait和waitpid
查看>>
linux fork多进程并发服务器模型之C/C++代码实战
查看>>
linux accept函数与三次握手没有半毛钱的关系------三次握手可能发生在调用accept函数之前
查看>>
用php代码获取机器的ip地址
查看>>
g++: cannot specify -o with -c or -S with multiple files 和nm: test.o: File format not reco 的原因和解决方案
查看>>
nm: test.o: File format not recognized的原因和解决方案
查看>>
libtest.a: could not read symbols: Archive has no index; run ranlib to add one的原因和解决方案
查看>>
线程其实很简单
查看>>