说明

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 变量技巧,提高灵巧布局效率!

    作者:Ahmad shaded 译者:前端小智 来源:sitepoint 点赞再看,微信搜索**[大迁世界]**关注这个没有大厂背景,但有着一股向上积极心态人.本文 GitHub github.com ...

  2. DBeaver下载安装与连接MySQL数据库

    一.Dbeaver下载 官网下载地址:Download | DBeaver Community 点击"Windows 64 bit (installer)"即可进行下载. 二.Db ...

  3. Java应用程序OOM分析

    内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用. 内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢 ...

  4. SpringMVC之RedirectAttributes属性

    RedirectAttributes是SpringMVC3.1版本之后出来的一个新功能,专门用于重定向之后还能带参数跳转的的工具类. 两种带参方式: redirectAttributes.addAtt ...

  5. 如何使用 pytorch 实现 yolov3

    前言 看了 Yolov3 的论文之后,发现这论文写的真的是很简短,神经网络的具体结构和损失函数的公式都没有给出.所以这里参考了许多前人的博客和代码,下面进入正题. 网络结构 Yolov3 将主干网络换 ...

  6. CKKS Part4: CKKS的乘法和重线性化

    本文翻译于CKKS EXPLAINED, PART 4: MULTIPLICATION AND RELINEARIZATION,主要介绍CKKS方案中的密文乘法和重线性化技术 介绍 在上一篇 CKKS ...

  7. ApacheCN JavaWeb 译文集 20211017 更新

    使用 Spring5 构建 REST Web 服务 零.前言 一.一些基本知识 二.在 Spring5 中使用 Maven 构建 RESTfulWeb 服务 三.Spring 中的 Flux 和 Mo ...

  8. 如何把一个数组中的对象的key值相等的对象合成一个对象

    比如这样一个数组:[{category:"中国梦",value:"10000"},{category:"有国才有家",value:" ...

  9. Python中处理日期时间库的使用方法

    常用的库有time.datetime.其中datetime库是对time库的封装,所以使用起来更加便捷.date是指日期时间(年月日)处理,time往往更加细小的单位(小时分秒等)的时间处理. 一.d ...

  10. War包是什么??

    感谢大佬: https://blog.csdn.net/Stitch__/article/details/88091745 https://www.jianshu.com/p/3b5c45e8e5bd ...