JoeChenzzz

导航

lambda表达式(c++11)

1.概念

1)lambda表达式是一个可调用的代码单元,它由一个捕获列表、一个参数列表、一个箭头、一个返回类型、一个函数体组成:

2)可以忽略参数列表和返回类型,但必须包含捕获列表和函数体

3)忽略参数列表:参数列表可以忽略,捕获列表不可以忽略,也就是说“()”可以忽略,“[]”不可以忽略

4)忽略返回类型:

  • 忽略返回类型同时也会忽略那个箭头
  • 如果lambda表达式的函数体只是一个单一的return语句,则返回类型可从return的表达式的类型来推断
  • 如果lambda表达式的函数体除了单一的return语句还有别的内容,则默认返回void
  • 单一的return语句包括带有条件运算符"?"的return语句,但不包括带有 if/else 条件判断的return语句

5)底层实现原理:仿函数

2.捕获列表

1)捕获列表一般为空,可以存放局部变量,来指出lambda会使用这些局部变量

2.1值捕获

  对局部变量采取拷贝的方式进行捕获,需要注意的是,是在创建lambda时拷贝,而不是使用lambda时:

2.2引用捕获

   对局部变采取引用的方式进行捕获,此时必须保证被引用的对象在lambda执行时是存在的(函数返回lambda时,这个lambda就不能使用引用捕获)。为什么需要引用捕获?因为有些局部变量不能被拷贝:

  ostream对象不能被拷贝

2.3隐式捕获

  =告诉编译器使用值捕获,&告诉编译器使用引用捕获:

  也可以混合使用隐式捕获和显示捕获,此时捕获列表中第一个位置必须是隐式捕获。

3.可变lambda

1)对于值捕获:默认情况下,lambda不会改变其值,但是如果希望改变,则需要在参数列表后面加上关键字mutable:

2)对于引用捕获:如果是const变量的引用,则不能改变它;如果是非const变量的引用,则可以改变

4.指定lambda的返回类型

  函数体有单一的return语句,我们无须指定返回类型,但是遇上显式的if/else条件判断有多个return语句的时候,就必须指定了:

5.标准库函数对象(非c++11)

  可以使用标准库定义的一些函数对象来充当泛型算法的谓词:

标准库定义的这些函数对象对指针同样适用(正常方法去比较两个不相关的指针是错误的):

在这里,是想要通过比较指针的它自己的地址来排序这个存有指针的vector。

posted on 2018-09-30 11:06  JoeChenzzz  阅读(220)  评论(0编辑  收藏  举报