C++11 Lambda的变量捕获和Lambda在Qt中的应用
2017-08-18 14:42
211 查看
一、Lambda
Lambda一般格式是:
[capture](param) mutable ->return-type {body}
这里主要复习一下Lambda中的capture
lambda中有个闭包的概念,也就是C这类语言中的域的概念,要访问闭包外的变量,就必须通过 [] 来捕获
[]的形式有以下
[] 未定义任何变量,不能访问lambda之外定义的变量
[x, &y] x是通过值复制来访问的,y通过引用访问
[&] 能通过引用访问外部所有变量
[=] 外部变量都是通过值复制来访问
[&, x] x通过值复制访问,其他变量通过引用访问
[=, &z] z通过引用访问,其他变量通过值捕获
这里有两个例子
int x=0;
int y = 42;
auto fun = [x, &y] {
std::cout<<"x: "<<x<<std::endl;
std::cout<<"y: "<<y<<std::endl;
y++;
}
x = y = 77;
fun();
fun();
std::cout<<"final y: "<<y <<std::endl;
输出结果为
x: 0
y: 77
x: 0
y: 78
final y: 79
这个例子很好理解,因为y是用引用传递的,在lambda中的改变也会反映到外部变量中,而x只是值传递,在lambda中只读
另一个例子
int id = 0;
auto fun = [id]() mutable {
std::cout<<"id: "<<id<<std::endl;
id++;
}
id = 42;
fun();
fun();
fun();
std::cout<<"id"<<std::endl;
输出结果为:
id: 0
id: 1
id: 2
42
这个例子中,在lambda的声明中使用了mutable。
在使用了mutable的lambda中,对象通过值传递,但可以在函数内部修改捕获变量的值。
有趣的是这个改变不会反映到外部变量
这非常类似不同函数总的静态变量
这里还要考虑一下lambda的类型问题
因为lambda是匿名函数对象,所以任何两个lambda的类型都不同。
在c++11中可以使用auto或者使用template来定义某lambda的类型,或者使用decltype()来获取类型
eg
std::function<int(int, int)> returnLambda() {
return [](int x, int y) {
return x*y;
}
}
二、在Qt中的应用
在Qt中主要用在槽函数中
eg.
connect(sender, &Sender::enabled, [=](bool enbaled) {
...
});
Lambda一般格式是:
[capture](param) mutable ->return-type {body}
这里主要复习一下Lambda中的capture
lambda中有个闭包的概念,也就是C这类语言中的域的概念,要访问闭包外的变量,就必须通过 [] 来捕获
[]的形式有以下
[] 未定义任何变量,不能访问lambda之外定义的变量
[x, &y] x是通过值复制来访问的,y通过引用访问
[&] 能通过引用访问外部所有变量
[=] 外部变量都是通过值复制来访问
[&, x] x通过值复制访问,其他变量通过引用访问
[=, &z] z通过引用访问,其他变量通过值捕获
这里有两个例子
int x=0;
int y = 42;
auto fun = [x, &y] {
std::cout<<"x: "<<x<<std::endl;
std::cout<<"y: "<<y<<std::endl;
y++;
}
x = y = 77;
fun();
fun();
std::cout<<"final y: "<<y <<std::endl;
输出结果为
x: 0
y: 77
x: 0
y: 78
final y: 79
这个例子很好理解,因为y是用引用传递的,在lambda中的改变也会反映到外部变量中,而x只是值传递,在lambda中只读
另一个例子
int id = 0;
auto fun = [id]() mutable {
std::cout<<"id: "<<id<<std::endl;
id++;
}
id = 42;
fun();
fun();
fun();
std::cout<<"id"<<std::endl;
输出结果为:
id: 0
id: 1
id: 2
42
这个例子中,在lambda的声明中使用了mutable。
在使用了mutable的lambda中,对象通过值传递,但可以在函数内部修改捕获变量的值。
有趣的是这个改变不会反映到外部变量
这非常类似不同函数总的静态变量
这里还要考虑一下lambda的类型问题
因为lambda是匿名函数对象,所以任何两个lambda的类型都不同。
在c++11中可以使用auto或者使用template来定义某lambda的类型,或者使用decltype()来获取类型
eg
std::function<int(int, int)> returnLambda() {
return [](int x, int y) {
return x*y;
}
}
二、在Qt中的应用
在Qt中主要用在槽函数中
eg.
connect(sender, &Sender::enabled, [=](bool enbaled) {
...
});
相关文章推荐
- C++11 Lambda的变量捕获和Lambda在Qt中的应用
- lambda表达式Bug——修改捕获变量失败
- Qt里textbrowser的小应用(textbrowser输出变量的值)
- Lambda表达式以及在QT5信号槽函数connect中的应用
- Java Lambda(语言篇——lambda,方法引用,目标类型,默认方法,函数接口,变量捕获)
- C++11Lambda捕获列表使用
- 获取某个应用运行数目并将终端结果赋值给Qt中的变量
- Lambda&Java多核编程-4-Lambda变量捕获
- Java 8 Lambda 捕获外部变量 -- 不可变的原因
- Java Lambda的变量捕获
- Qt获取系统环境变量
- Qt 底层输入的截获InputMethod 方法的简单应用
- OC高级编程——深入block,如何捕获变量,如何存储在堆上
- SQL Server 表变量的应用介绍
- c++11新特性(4) lambda捕捉块
- 线程高级应用-心得3-线程范围内的共享变量以及应用场景及面试题案例分析
- mac osx上为qt应用生成debug symbol
- C++理解全局变量在调用函数中的应用
- C++11中的匿名函数(lambda函数,lambda表达式)
- 无服务器探索之路(初级):AWS Lambda服务应用场景实践之一(七)