c++11 Lambda表达式

c++11引入了Lambda表达式,用于定义并创建匿名的函数对象,以简化编程工作。
最简单的Lambda表达式如这样:

也可以在定义的时候直接调用:

或者把它传递给一个变量,再调用,可以多次调用:

完整的lambda表示格式如下:

  • 中括号里是指明要捕获的外部作用域的变量。
  • 小括号是传递给lambda表达式的参数。
  • mutable修饰符,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。
  • exception声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用throw(int)。
  • ->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。
  • 大括号就是函数体了。

捕获参数

lambda表达式中括号是用来捕获外部作用域的变量的:

  • [],不捕获任何外部作用域变量。
  • [=],按值传递的方式捕获所有外部作用域的变量。
  • [&],按引用传递的方式捕获所有外部作用域的变量。
  • [x,&y],个别的指明值的捕获方式。
  • [=,&y],y按引用传递,其他按值传递。
  • [&,y],y按值传递,其他按引用传递。

mutable修饰符可以对值传递的变量进行修改,并保存状态:

lambda的类型,是个匿名的函数对象。每个lambda表达式的类型都是独一无二的。但可用std::function<>模版接受一个一般化的lambda:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注