说明

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表达式的更多相关文章

  1. QT+lambda 表达式

    #include "mainwidget.h" #include <QPushButton> #include <QDebug> MainWidget::M ...

  2. Qt 5 最新信号和槽连接方式以及Lambda表达式

    最近学习Qt,发现新大陆,这里做下记录. 主要内容就是原始Qt4的信号槽连接方式,以及Qt5新版的连接方式,还有件事简单演示一下lambda表达式的使用方式 代码如下 /* * 作者:张建伟 * 时间 ...

  3. Qt 使用 lambda 表达式做为槽函数时为什么使用 QObject::sender() 获取到的发送信号对象指针为空?

    /*! Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; ...

  4. QT_5_ Qt中信号和槽 + 自定义信号和槽 + lambda 表达式

    1.Qt中信号和槽 1.1 需求:点击按钮关闭窗口 1.2 利用connect进行链接 1.3 参数1 信号发送者(指针) 参数2 发送的信号(信号地址) 参数3 信号的接受者(指针) 参数4 处理槽 ...

  5. Qt中使用匿名函数lambda表达式

    一.为什么要使用匿名函数lamdba 首先,lambda表达式可以使代码变得简单,C++中,一个lambda表达式表示一个可调用的代码单元.如代码: #include <QCoreApplica ...

  6. Qt5中使用lambda表达式

    c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...

  7. Qt5中的lambda表达式和使用lambda来写connect

    c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...

  8. C++11之lambda表达式应用

    应用 foreach语句中 #include <time.h> #include <algorithm> using namespace std; void func(int ...

  9. java8-01-初识Lambda表达式

    为什么用 Lambda表达式          在java8之前  java语言 方法调用  无法将函数作为一个参数      也无法声明返回一个函数          对比 javaScript是典 ...

随机推荐

  1. 前端基础之CSS(浮动-解决溢出-实现个人头像框)

    目录 一:浮动float 1.什么是浮动? 2.浮动的作用 3.浮动有两个特点 4.float格式 二:代码实现左右浮动边框 三:浮动造成父标签塌陷问题(清除浮动) 1.浮动会造成父标签的影响 三:清 ...

  2. undo和redo的区别

    undo和redo的区别: undo一般用于事务的取消与回滚,记录的是数据修改前的值: redo一般用于恢复已确认但未写入数据库的数据,记录的是数据修改后的值.

  3. pycharm 安装插件

    1.使用pip安装插件 pip安装指定版本的插件: pip install openpyxl==2.6.2 -i https://pypi.doubanio.com/simple/ -i后面跟的是&q ...

  4. plsql 带参数的游标

    -- 带参数的游标 -- cursor c(no emp.deptno%type) is select * from emp where deptno=no; 参数的起名 不要和表中的列名相同! -- ...

  5. ApacheCN 数据科学译文集 2020.8

    协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>,生活原则 2.3.c 在线阅读 ApacheCN 面试求职交流群 724187166 Apach ...

  6. iBooker AI+财务提升星球 2020.4 热门讨论

    比特币量化套利的心路历程(附python量化招聘)(分享自知- 如何选择一份好的工作? 你知道为什么大家都想去好公司吗? 不- #财务知识# 可转债套利 辉丰转债128012套利之三个知道- #财务知 ...

  7. MySQL 新增表分区很慢,转移大表数据

    问题: MySQL (version 5.7.26) 数据库有一批表 xxx_yyy,由于评估的数据量可能比较大,因此每张表都设置了表分区,把每个月的数据保存在单独的分区里. 那么如果每年年末,没有提 ...

  8. js表达式和语句

    表达式 一个表达式可以产生一个值,有可能是运算.函数调用.有可能是字面量.表达式可以放在任何需要值的地方. 语句 语句可以理解为一个行为,循环语句和判断语句就是典型的语句.一个程序有很多个语句组成,一 ...

  9. MySQL基本命令操作及数据库基本概念

    MySQL基本命令操作及数据库基本概念 1.数据库的基本概念 2.主流数据库介绍 3.关系型非关系型数据库介绍 4.Mysql 安装方法 5.Mysql 基本操作命令 1.数据库的基本概念: 数据库的 ...

  10. Windows服务调用Office时,未将对象引用的实例

    Windows键+R键                         回车 输入:comexp.msc -32               回车 点击控制台根节点--组件服务--计算机--我的电脑- ...