Lambda表达式
1 背景
今天开发过程中遇到了Lambda表达式,随手记录一下。
2 Lambda表达式的基本构成
/* [函数对象参数](操作符重载函数参数)mutable -> 返回值{函数体} */
[capture](parmeters)mutable -> return-type
{
statement
}
-
函数对象参数
[]
,标识一个Lambda的开始,这部分必须存在,不能省略。函数对象参数时传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用到那些到定义lambda为止时,lambda所在的作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:空
。没有使用任何函数对象参数=
。函数体内可以使用lambda所在作用范围内所有可见的局部变量(包括lambda所在类的this),并且是==值传递方式==(相当于编译器自动为我们按值传递了所有的局部变量)&
。函数体内可以使用lambda所造范围内所有可见的局部变量(包括Lambda所在类的this),并且是==引用传递方式==(相当于编译器自动为我们按引用传递了所有的局部变量)this
。函数体内可以使用lambda所在类的成员变量a
。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数时const的。要修改传递进来的a的拷贝,可以添加mutable修饰符&a
。将a按引用进行传递a, &b
。将a按值进行传递,b按引用进行传递。=, &a, &b
。除a和b按引用进行传递外,其他参数都按值进行传递&, a, b
。除a和b按值进行传递外,其他参数都按引用进行传递。
-
操作符重载函数参数
标识重载的
()
操作符的参数,没有参数时,这部分可以省略。参数可以通过按值(如:(a, b))和按引用(如:(&a, &b))两种方式传递。 -
可修改标识符
mutable声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
QPushButton *mybut1 = new QPushButton(tr("按钮1"), this); QPushButton *mybut2 = new QPushButton(tr("按钮2"), this); mybut2->move(100, 100); int m = 10; connect(mybut1, &QPushButton::clicked, this, [m]() mutable { m = 100 + 10; qDebug() << m; /* 110 */ }); connect(mybut2, &QPushButton::clicked, this, [=]() { qDebug() << m; /* 10 */ }); qDebug() << m; /* 10 */
-
函数返回值
->返回值类型
,标识函数返回值的类型,当发挥至为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略 -
函数体
{}
,标识函数的实现,这部分不能省略,但函数体可以为空