lambda表达式学习

lambda表达式的基本形式,如下:
[capture list] (params list)  [key word: mutuble] ->return type { func body }
说明:
(1) [capture list]里面的内容具体形式如下:

lambda表达式学习_第1张图片

(2) params list 输入参数,这个和普通的函数一样
(3)keyword:mutuble:默认情况下,lambda表达式不会改变一个通过传值方式来捕获参数的值,通过mutuble可以实现这个问题。
(4)return type:默认该部分是可选的,但是如果lambda表达式有2个或以上的return,那么必须指定返回类型
(5) func body:函数体


以下是一些例子

#include 
#include 
#include 
using namespace std;


void testCaptureList()
{
  int a = 1;
  int b = 2;
//  auto fun = []() { cout << a + b << endl;}; // error 无法隐式捕获“a” "b",因为尚未指定默认捕获模式
  auto fun0 = [a,b]() { cout << a + b << endl;}; //0k
  fun0();     //3
  auto fun1 = [=]() { cout << a + b << endl;}; // OK
//  auto fun2 = [=]() { a++; cout << a + b << endl;}; // error C3491: “a”: 无法在非可变 lambda 中修改通过复制捕获
  fun1();     //3
  cout << "a = " << a << " b = " << b << endl;
  auto fun3 = [&]() { a++; b++; cout << a + b << endl;};  
  fun3();     //5

  cout << "a = " << a << "  b=" << b << endl;
 // auto fun4 = [=, &a] () { a++; b++; cout << a + b << endl;}; // error C3491: “b”: 无法在非可变 lambda 中修改通过复制捕获
  auto fun5 = [&b, &a]() { a++; b++; cout << a + b << endl;}; 
  fun5();     //7
}

void testReturnType()
{
  auto fun1 = []() {return 1;};
  cout << fun1() << endl;

  auto fun2 = [](int a) {return a + 1;};
  cout << fun2(4) << endl;

  int bbb = 5;
  //在VS2017编译可以通过,在code:blocks 16.01编译出现问题(error C3499: 已指定返回类型为 void 的 lambda 无法返回值) 
  auto fun3 = [](int a) { if (a < 0) return -a; else return a;};
  cout << fun3(bbb) << endl;

  auto fun4 = [](int a) -> int { if (a < 0) return -a; else return a;};
  cout << fun4(-4) << endl;
}

void testMutable()
{
  int v1 = 33;
  auto f = [v1]() mutable {return ++v1;};
  v1 = 0;
  cout << f() <<" ," <
关于lambda表达的效率问题,参考文章: c++11 lambda 的效率

你可能感兴趣的:(Cplusplus)