Qt:lambda表达式
说明
c11之后加入了lambda表达式,所以Qt也支持
加载项
CONFIG += c++11
用法
[ capture ] ( parameters ) mutable -> return_type { code }
说明
| capture | 捕获列表 |
[]是Lambda引出符。编译器根据该引出符判断接下来的代码是否是Lambda函数。 捕获列表可以捕获上下文中变量以供Lambda函数使用,[]中的捕获列表由多个捕获项组成,并以,分隔。 捕获列表的几种形式: [var]:值传递捕捉变量var; [&var]:引用传递捕获变量var; [=]:值传递捕获所有父作用域变量(包括this); [&]:引用传递捕获所有父作用域变量(包括this); [this]:值传递捕获当前的this指针。 父作用域:包含Lambda的{}代码块。 上述捕获列表还可以进行组合,例如: [= , &a , &b]:引用传递捕获a、b,值传递捕获其他所有变量; [& , a ,this]:值传递捕获a和this,引用传递捕获其他所有变量。 注意,捕获列表不允许重复传递,不然会导致编译错误: [= , a]:已经以值传递方式捕获了所有变量,但是重复捕捉a; [& , &this]:已经以引用传递捕获了所有变量,但是重复捕捉了this。 |
| parameters | 参数列表 | 与普通函数参数列表一致。如果不需要参数传递,可以和括号()一起省略 |
| mutable | mutable修饰符 |
默认情况下,Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不能省略(即使为空)。 const函数中,只能修改static变量,也就是说,通过值传递时,不能修改任何上下文所有非static变量; 除非:1、通过引用传递修改变量值(会同时改变上下文变量); 2、mutable修饰符,可以在函数中修改变量值,但是值传递时这个变量只是局部变量,引用传递会同时修改上下文变量值。 |
| ->return_type | 返回类型 |
不需要返回值时,可以连同->一起省略。 此外,返回类型明确时,也可省略该部分,让编译器对返回类型进行推导 |
| {statement} | 函数体 |
内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。 与普通函数的区别在于:Lambda函数可以通过捕获列表访问一些上下文中的数据。 捕获列表中描述了上下文中哪些数据可以被Lambda使用以及使用方法(值传递、引用传递) |
例子
一个简单的Lambda
auto func = [= , &b] (int c) ->int {return b += a + c ;}
mutable的用法
int n = 0;
auto func1 = [=](){ n = 3; }; //wrong!!! auto func2 = [=]() mutable { val = 3; };//可以修改上下文变量,但只是局部变量
func2();
cout<<n<<endl; // 0 auto func3 = [&]() { n = 4; };//可以修改上下文变量,同时改变它
func3();
cout<<n<<endl; // 4 auto func4 = [&]() mutable{ n = 5; };//可以修改上下文变量,同时改变它
func4();
cout<<n<<endl; // 5
Qt:lambda表达式的更多相关文章
- QT+lambda 表达式
#include "mainwidget.h" #include <QPushButton> #include <QDebug> MainWidget::M ...
- Qt 5 最新信号和槽连接方式以及Lambda表达式
最近学习Qt,发现新大陆,这里做下记录. 主要内容就是原始Qt4的信号槽连接方式,以及Qt5新版的连接方式,还有件事简单演示一下lambda表达式的使用方式 代码如下 /* * 作者:张建伟 * 时间 ...
- Qt 使用 lambda 表达式做为槽函数时为什么使用 QObject::sender() 获取到的发送信号对象指针为空?
/*! Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; ...
- QT_5_ Qt中信号和槽 + 自定义信号和槽 + lambda 表达式
1.Qt中信号和槽 1.1 需求:点击按钮关闭窗口 1.2 利用connect进行链接 1.3 参数1 信号发送者(指针) 参数2 发送的信号(信号地址) 参数3 信号的接受者(指针) 参数4 处理槽 ...
- Qt中使用匿名函数lambda表达式
一.为什么要使用匿名函数lamdba 首先,lambda表达式可以使代码变得简单,C++中,一个lambda表达式表示一个可调用的代码单元.如代码: #include <QCoreApplica ...
- Qt5中使用lambda表达式
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- Qt5中的lambda表达式和使用lambda来写connect
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- C++11之lambda表达式应用
应用 foreach语句中 #include <time.h> #include <algorithm> using namespace std; void func(int ...
- java8-01-初识Lambda表达式
为什么用 Lambda表达式 在java8之前 java语言 方法调用 无法将函数作为一个参数 也无法声明返回一个函数 对比 javaScript是典 ...
随机推荐
- Vulnhub DC-1靶场学习笔记
0x00 环境准备 本文介绍了Vulnhub中DC-1靶机的实战渗透过程,实战的目标是获取到服务器中的5个flag,最终目标是获取到root目录下的thefinalflag文件: 测试环境 备注 Ka ...
- linux移动文件与删除文件
目录 一:移动文件 二:删除文件 一:移动文件 移动文件相当于剪切. 格式: mv[移动文件的原路径][移动文件的新路径] 案例: 1.移动文件 案例1:将/root目录下的1.txt移动到/opt目 ...
- JVM调优方法
目 录 目 录 I 诠释JVM调优 1 第1章 JVM内存模型及垃圾收集算法 1 1.1 根据Java虚拟机规范,JVM将内存划分为 1 1.2 垃圾回收算法 1 第2章 内存泄漏及解决方法 2 2. ...
- 关于Linux安装中NAT模式和桥接模式的区别详解(转载)
1.一般我们在创建一个Linux虚拟机时候,会面临三个网络配置选择: 桥接模式.nat模式.host-only模式(主机模式,这个模式用得少,就不介绍了) 2.NAT模式: 所谓nat模式,就是虚拟系 ...
- Python初学笔记之可变类型、不可变类型
python中 可变类型: 列表 list 字典 dict 不可变类型: 数字型:int.float.complex.bool.long 字符型 str 元组 tuple id(i):通过id查看变量 ...
- Vue3源码分析之 Ref 与 ReactiveEffect
Vue3中的响应式实现原理 完整 js版本简易源码 在最底部 ref 与 reactive 是Vue3中的两个定义响应式对象的API,其中reactive是通过 Proxy 来实现的,它返回对象的响应 ...
- 导入 static 修饰的包
一 static关键字,可以修饰变量 方法 代码块 , 静态内部类. 还可以用来修饰 需要导入的包 准备工作 package zhouxufeng; public class Text1 { ...
- 羽夏看Win系统内核——句柄表篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- KMP 入门
再次学习 \(\rm KMP\) 后不一样的理解. 一些概念 定义字符串 \(S\) 的真 前/后 缀为非自身的 前/后 缀. 定义字符串 \(S\) 的 \(border\) 为 \(S\) 的公共 ...
- spring学习三:Spring Bean 生命周期
Bean 的生命周期 理解 Spring bean 的生命周期很容易.当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态.同样,当 bean 不再需要,并且从容器中移除时,可能需 ...