lambda表达式

某视频介绍:

// = :把外部所有局部变量、类中所有成员以值传递方式

// this :  类中所有成员以值传递方式

// & :把外部所有局部变量,不包括类中的成员, 引用符号  (我验证后类中的成员也可以包括???有点晕)

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
//    sum = 32;
    b1 = new QPushButton(this);
  QPushButton *b4 = new QPushButton(this); b1
->setText("close"); b1->move(100, 100); b2.setParent(this); b2.setText("show"); b3.setParent(this); b3.move(150, 150); b3.setText("Lamda表达式"); int a=2,b=5; connect(b1, &QPushButton::clicked, this, &MyWidget::close); connect(&b2, &QPushButton::released, this, &MyWidget::showSub); connect(&sub, &SubWidget::showMy, this, &MyWidget::showMyWidget); void (SubWidget::*showDebug)() = SubWidget::showDebugSignal; void (SubWidget::*showDebugWithInfo)(int, QString) = SubWidget::showDebugSignal; connect(&sub, showDebug, this, &MyWidget::outPutDebug); connect(&sub, showDebugWithInfo, this, &MyWidget::outPutDebugTest); connect(&b3, &QPushButton::clicked, [&]() //mutable { qDebug() << "lamda111"; b3.setText("lamda done"); qDebug() << a << b; qDebug() << sum; } ); } 按下b3 按钮,程序输出 lamda111 0 22062380 23

分析原因,connect里的&b3 因为是this的子对象,父对象不消亡,子对象没主动析构不会消亡。所以[&]传引用的情况下lambda表达式内对b3操作没问题,但是a和b两个局部变量就不行了,构造函数运行完后,栈上的局部变量就会释放掉,所以输出a和b的值为   0 22062380  出错了。而sum是在头文件里给了初始值的成员变量,够着函数运行完后还是存在的,所以sum打印正常。

由于上面课程讲的和我验证的有点不符合,就查了下准备查下lambda详细内容。

lambda表达式产生的原因:

  当条件限制只能传一个参数,但是算法需要传递更多的参数的情况下,用lambda解决。

lambda表达式介绍:

  四种可调用对象之一,四种分别为函数、函数指针、lambda表达式、重载了函数运算符的类。 

  完整形式:

    [capture list](parameter list) -> return type {function body}

  最简形式:

    必须有捕获列表和函数体

    如:auto f = [ ] {return 42;};

      cout << f() << endl;  //调用方式与普通函数相同

  捕获列表捕获时间:

    lambda定义出来就是一个新类;

    函数传递一个lambda,生成一个未命名对象;     使用auto定义一个lambda初始化变量,从lambda生成类型对象;

    lambda生成的类包含一个lambda捕获变量的数据成员,   lambda对象创建时初始化此成员。  创建对象时捕获而不是调用时捕获。  

  static变量:不用捕获,lambda直接用,值会随外部修改变化

  成员变量:(不=且不& ,lambda内无法用)无论用=还是用&捕获,其实都是捕获的this,值会随外部修改变化。

  =拷贝捕获的加mutable ,变量lambda内能修改;

  &引用捕获的const变量 ,变量lambda内还是不能修改;

  

原文地址:https://www.cnblogs.com/qijunzifeng/p/13763387.html