C++1114新标准——Lambdas,decltype

news2024/11/24 20:13:02

系列文章目录

C++11&14新标准——Variadic templates(数量不定的模板参数)
C++11&14新标准——Uniform Initialization(统一初始化)、Initializer_list(初始化列表)、explicit
C++11&14新标准—— =delete、=default
C++11&14新标准——模板模板参数(Template Template Parameter)、using
C++11&14新标准——Lambdas,decltype


文章目录

  • 系列文章目录
    • Lambdas
      • 使用例
    • decltype


Lambdas

   Lambdas即为匿名函数,他的格式一般为:

[ captures ] ( params ) specifiers exception attr -> ret { body }  (1) 
[ captures ] ( params ) -> ret { body }                            (2) 
[ captures ] ( params ) { body }                                   (3) 
[ captures ] { body }                                              (4)                                  

captures: 捕获参数,即Lambdas内会使用到的之前定义的变量。详细格式见下图。

格式意义
[ ]默认不捕获任何变量
[ = ]默认以值捕获所有变量
[ & ]默认以引用捕获所有变量
[ x ]仅以值捕获x变量
[ &x ]仅以引用捕获x变量
[ =, &x ]默认以值捕获所有变量,但以引用捕获x变量
[ &, x ]默认以引用捕获所有变量,但以值捕获x变量
[ this ]通过引用捕获当前对象
[ *this ]通过值捕获当前对象

params:参数列表,Lambdas需要接收的参数。

ret:返回类型,不写的话编译器也可以自己推断。

body:函数体。

specifiers:限定符列表。比如mutable表示会更改捕获参数,const表示不会更改捕获参数。

exception:异常规定。比如noexcept表示不会抛出异常。

attr:属性规定,相当于是一个有一定功能的提醒,例如nodiscard属性告诉编译器,这个lambda表达式的返回值不应该被忽略。如果调用这个lambda并且不使用它的返回值,编译器可能会产生一个警告。

auto lambda = []() [[nodiscard]] {
    return 42;
};

再比如deprecated属性标记了这个lambda表达式已经不推荐使用,并提供了一个字符串消息,指出了替代的推荐用法。如果使用这个lambda,编译器可能会产生一个关于弃用的警告。

auto lambda = []() [[deprecated("Use newFunction() instead")]] {
    // Do something
};

使用例

  1. 定义一个匿名函数
[]{
    std::cout<< "hello world!" <<std::endl;
}
  1. 调用匿名函数
[]{
    std::cout<< "hello world!" <<std::endl;
}();
  1. 传递匿名函数给一个变量,并调用
auto l = []{
    std::cout<< "hello world!" <<std::endl;
};
l();
  1. 带参数列表的匿名函数
auto l = [](const std::string &s){
    std::cout<< s <<std::endl;
};
l("hello world!");
  1. 带捕获参数的匿名函数
int x = 1;
int y = 2;
auto f = [x, &y] {
            std::cout<<"x:" << x << std::endl;
            std::cout<<"y:" << y << std::endl;
            ++y;
            //++x;//Error
         };
x = y = 77;
f(); //输出x:1 ,y:77
f();//输出x:1 ,y:78
std::cout<< "final y: " << y <<std::endl;//final y:79

从这个例子可以看出,捕获参数列表,在定义lambdas的时候就对参数进行捕获,定义是x = 1,捕获参数x以值传递,所以在f中x就为1,哪怕后续x = 77了,f()输出的x仍然为1。但对于y的捕获是以引用传递,定义里y为2,但后续过程中y = 77了,相应的f()中的y也为77。

为什么写++x会报错呢?因为x是以值传递的,相当于权限为onlyread,如果想要改变x的值,就必须加上mutable关键字。y则是以引用传递的,不加mutable也可以变化。

decltype

decltype是c++11定义的一个新关键字,作用是获得对象的类型。
在这里插入图片描述
他有三种主要的应用:

  1. 用于声明返回类型,下面两种格式效果一样。
    在这里插入图片描述
    在这里插入图片描述
  2. 用于元模板编程,通过模板对象获取模板类型。
    在这里插入图片描述
  3. 用于匿名函数,获得匿名函数返回值的类型。

    但用这种方法使用lambdas的时候要注意,如果使用这种方法初始化set,编译器会报错:
std::set<Person,decltype(cmp)> coll();

采用set的默认构造函数,会调用参数类型即lambdas的默认构造函数,但lambdas是没有构造函数和赋值重载,所以不能用这种方式进行初始化。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python数据分析系列】一文搞懂二维数组中的排列组合(案例源码)

一、问题场景 在工作中&#xff0c;我们经常会碰到这样的问题场景&#xff0c;有一个4行5列的二维数组&#xff08;4个波段&#xff0c;5个采样点&#xff09;&#xff0c;一行&#xff08;一个一维数组&#xff09;代表一个波段&#xff0c;我想知道数组中任意两个波段的差&am…

ESP32 连接阿里云 MQTT 报错MQTT Connect err:2

解决方法 跳转到 这个头文件<PubSubClient.h>里 MQTT_MAX_PACKET_SIZE 把这个的大小从原来的256 改为1024 MQTT_KEEPALIVE 把这个大小从原来的15 改为65 修改后再次连接即可成功 如下图&#xff1a;

下一代实时数据库:Apache Doris 【六】数据划分

3.4 数据划分 3.4.1 列定义3.4.2 分区与分桶3.4.3 PROPERTIES3.4.4 ENGINE3.4.5 其他后记 3.4 数据划分 以 3.3.2 的建表示例来理解。 3.4.1 列定义 以 AGGREGATE KEY 数据模型为例进行说明。更多数据模型参阅 Doris 数据模型。 列的基本类型&#xff0c; 可以通过在 mysql-cli…

【vSphere | VM】虚拟机自定义规范Ⅳ —— 使用虚拟机自定义规范创建 Linux 和 Windows VM

目录 5. 使用虚拟机自定义规范创建VM5.1 Linux 虚拟机示例Rocky Linux 9.2&#xff08;1&#xff09;克隆虚拟机&#xff08;2&#xff09;模板部署虚拟机 5.2 Windows 虚拟机示例Windows 10&#xff08;1&#xff09;克隆虚拟机&#xff08;2&#xff09;模板部署 Windows 10 …

Unity Meta Quest 一体机开发(十一):【手势追踪】远距离抓取

文章目录 &#x1f4d5;教程说明&#x1f4d5;玩家配置 DistanceHandGrabInteractor&#x1f4d5;物体配置 DistanceHandGrabInteractable&#x1f4d5;调整物体飞向手部的速度&#x1f4d5;调整探测物体的范围⭐HandFrustumNarraw⭐HandFrustumWide⭐HeadFrustum 此教程相关的…

高德地图画线,适用于在地图上画出各种道路

addPolyline() {let AMap this.AMaplet polyline new AMap.Polyline({// map: this.map,// polyline 路径path: [new AMap.LngLat("119.368904", "30.913423"),new AMap.LngLat("119.382122", "30.901176"),],strokeColor: #F3D930,…

MapReduce基础编程

文章目录 第1关&#xff1a;合并去重第2关&#xff1a;整合排序第3关&#xff1a;信息挖掘 第1关&#xff1a;合并去重 编程要求 对于两个输入文件&#xff0c;即文件A和文件B&#xff0c;请编写MapReduce程序&#xff0c;对两个文件进行合并&#xff0c;并剔除其中重复的内容…

Ngnix之反向代理、负载均衡、动静分离

目录 1. Ngnix 1.1 Linux系统Ngnix下载安装 1.2 反向代理 正向代理&#xff08;Forward Proxy&#xff09;&#xff1a; 反向代理&#xff08;Reverse Proxy&#xff09;&#xff1a; 1.3 负载均衡 1.4 动静分离 1. Ngnix Nginx是一个高性能的开源Web服务器&#xff0…

无惧数据泄露风险:迅软科技与电子科技公司共同谱写的安全合奏

当今&#xff0c;电子信息产品已广泛渗透到我们生活的各个领域&#xff0c;涵盖通信、医疗、计算机及其周边视听产品、玩具、军工等多个领域。电子信息科技行业作为典型的知识技术密集型行业&#xff0c;具备科技含量高、专利众多、知识产权丰富、核心数据密级高等特点。随着行…

猫头虎博主揭秘:令人叹为观止的编程语言与代码技巧 ‍

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

GEE:根据像素数量删除非常分散且面积较小的对象(斑块/超像素)

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上,斑块(对象/超像素)的像素数量计算方法,并根据斑块的像素数量删除某一类土地利用数据中面积低于指定阈值的斑块(对象/超像素)的代码。 结果如下图所示,简言之,就是将下图中面积小的对象删除,只…

MybatisPlus【进阶】--悲观锁,乐观锁,生成后台数据:javafaker

什么是悲观锁 悲观锁&#xff1a;十分悲观&#xff0c;认为总是出现问题&#xff0c;无论干什么都会上锁&#xff0c;再去操作 悲观锁是基于一种悲观的态度类来防止一切数据冲突&#xff0c;它是以一种预防的姿态在修改数据之前把数据锁住&#xff0c;然后再对数据进行读写&…

山西电力市场日前价格预测【2023-12-19】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-19&#xff09;山西电力市场全天平均日前电价为562.84元/MWh。其中&#xff0c;最高日前电价为1168.60元/MWh&#xff0c;预计出现在18:00。最低日前电价为361.89元/MWh&#xff0c;预计…

分享!!!(一)小编总结的base64、blob、图片文件二进制相互转换的方式以及源码

目录 第一章 了解 1.1 大概结构 1.2 准备阶段 1.2.1 了解canvas 1.2.2 了解imageData 1.2.3 了解imgUrl 1.2.4 了解base64 1.2.5 了解blob/文件二进制流 1.2.6 了解arraybuffer 1.2.7 文件、图片 第二章 掌握图中的相互转换 2.1 cavas 与 imageData的互相转换 2.1…

基于OpenVidu的视频会议解决方案

OpenVidu是什么 OpenVidu 是一个开源的实时音视频通信平台&#xff0c;基于 Apache 2.0 协议开源的 WebRTC 视频会议平台&#xff0c;源码仓库地址&#xff1a;https://github.com/OpenVidu/openvidu。它提供了一组 API 和 SDK &#xff0c;使开发人员能够轻松地在 Web 和移动…

山区老人爱的礼物丨走进武隆区土地乡为山区老人送温暖

从车水马龙的城市到人烟稀少的乡村&#xff0c;穿越重峦叠嶂的高山&#xff0c;见到的是独属于大山的辽阔和山区老人眼中的星河。近日&#xff0c;传益千里为爱出发&#xff0c;在三棵柚公益基金会的支持下开展“山区老人爱的礼物”公益计划&#xff0c;走进武隆区土地乡&#…

GeoTrust SSL证书:您的网络信任卫士

在如今的数字化时代&#xff0c;我们的网络交易如脉搏般不断跳动&#xff0c;在这个过程中&#xff0c;安全保障尤其重要。于是像GeoTrust这样的品牌应运而生&#xff0c;它向我们承诺一件事情&#xff1a;无论在什么时候&#xff0c;我们的数据和交易都能得到最强的保护。下面…

Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)

目录 一、前言 二、基于注解配置Bean 1.基本介绍 : 2.应用实例 : 3.注意事项 : 三、手动实现Spring 注解配置机制 1.需求 : 2.思路 : 3.实现 : 3.1 自定义注解类 3.2 自定义配置类 3.3 自定义容器类 3.4 在测试类中进行测试 四、自动装配 0.总述 : 1.AutoWired自动装…

关于 Redis 与传统关系型数据库的选择

当需要为你的应用程序选择合适的数据库时&#xff0c;选择何种数据库通常取决于你项目的特定要求。Redis 是一种高性能的内存数据存储&#xff0c;而 MySQL 等传统关系型数据库也各自具有自己的优势和劣势。在本期文章中&#xff0c;我们将探讨在 Redis 和传统关系型数据库之间…

minio异常处理:S3 API Requests must be made to API port

1、创建minio服务时候需要映射出console端口和api端口&#xff0c;指定console端口和api端口 docker run -p 9000:9000 -p 9099:9099 --name minio -d --restartalways -e "MINIO_ACCESS_KEYadmin" -e "MINIO_SECRET_KEYMINIOE:<&G5*;dL?(fr" -v…