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是典 ...
随机推荐
- 多选菜单shell脚本
有 很多方法 可以读取Bash脚本中的用户输入. 但是,允许用户键入输入会带来一些问题. 主要问题是输入验证,您必须在其中考虑所有可能的输入. 解决此问题的一种简单方法是为Bash脚本创建一个多选菜单 ...
- Java安全之C3P0利用与分析
Java安全之C3P0利用与分析 目录 Java安全之C3P0利用与分析 写在前面 C3P0 Gadget http base C3P0.getObject() 序列化 反序列化 Class.forN ...
- JavaScript基本数据类型和引用数据类型详解
数据类型小知识 JavaScript主要数据类型共有7种,有string.number.boolean.undefined.null.symbol.object.其余7种可以笼统的分为两大类:基本数据 ...
- How to check in Windows if you are using UEFI
You might be wondering if Windows is using UEFI or the legacy BIOS, it's easy to check. Just fire up ...
- python操作MySQL数据库连接
目录 一:python操作MySQL 1.python如何操作MySQL? 2.什么是 PyMySQL? 二:PyMySQL 安装 1.方法一: 2.方法二: 三:pyMySQL模块基本使用 1.py ...
- SpringBoot + Log4j2使用配置 (转)
前言 后台程序开发及上线时,一般都会用到Log信息打印及Log日志记录,开发时通过Log信息打印可以快速的定位问题所在,帮助我们快捷开发.程序上线后如遇到Bug或错误,此时则需要日志记录来查找发现问题 ...
- Linux shell脚本之 if条件判断 (转)
IF条件判断 1.基本语法: if [ command ]; then 符合该条件执行的语句 fi 2.扩展语法: if [ command ];then 符合该条件执行的语句 elif [ comm ...
- 学习JSP篇:jsp简单介绍
这几天开始学习JSP和Servlet,写些博客,记录自己的学习过程,算是自己从业开始的一个见证. 一.什么是JSP JSP的全称是Java Service Page,一种动态的网页开发技术,区别于静态 ...
- JS特殊监听方法
//监听元素变化classList //监听元素变化className //方法一 var tab2Interval = setInterval(function(){ if(!!($('#tab-2 ...
- Python将py文件编译为exe的方法
使用PyCharm工具写好的Python程序脚本,怎么将.py文件编译为可执行的.exe文件 前提是已经安装了Python环境. 第一步:在PyCharm内下载安装pyinstalle库或使用CMD安 ...