C++ 11新特性之auto和decltype

概述

        在C++ 11标准中,引入了两大关键类型推导机制,即:auto关键字和decltype表达式。这两个特性不仅极大地简化了代码编写,提升了可读性,还为开发者提供了更加灵活、直观的类型声明方式。本文将详细解读auto和decltype的概念、工作原理及其在实际编程中的应用。

auto的使用

        auto在C++ 03中表示临时变量的语义,由于使用极少且多余,在C++ 11中已被删除。在C++ 11之前,变量的类型必须在声明时显式指定。然而,随着模板元编程和复杂类型表达式的广泛使用,手动书写完整的类型显得既冗余又容易出错。C++ 11引入的auto关键字解决了这个问题,并具有两种用途:自动类型推断和返回值占位。

        1、自动类型推断。当使用auto声明变量时,编译器会根据初始化表达式自动推断变量的类型。

#include <iostream>
#include <vector>
using namespace std;int main()
{std::vector<int> vctNumber = {1, 2, 3};// it 的类型会被推断为 std::vector<int>::iteratorauto it = vctNumber.begin();return 0;
}

        2、函数返回值类型推断。auto还可以用于声明函数的返回类型,尤其在配合尾置返回类型时,可以方便地推断模板函数的返回类型。

template<typename T, typename U>
auto add(T a, U b) -> decltype(a + b)
{return a + b;
}

        3、下面是一些使用auto的示例。

// 错误示例:没有初始化表达式,无法推断出a的类型
auto a;
// 错误示例:auto临时变量的语义在C++ 11中已不存在
auto int a = 10;
auto a = 10;
auto c = 'A';
auto s("CSDN");
vector<int> vctTemp;
auto it = vctTemp.begin();
auto ptr = [](){ cout << "Hello CSDN" << endl; };

decltype的使用

        decltype是一个操作符,可用于推导括号内表达式的类型,其规则如下:

        1、如果表达式e是一个变量,那么就是这个变量的类型。

        2、如果表达式e是一个函数,那么就是这个函数返回值的类型。

        3、如果以上都不符合,则看e是左值还是右值。若e是左值,类型为T,那么decltype(e)是T&;若是右值,则是T。

        decltype的精妙之处在于以下两点。

        1、类型查询。decltype是一种类型指示符,它允许程序员查询并引用表达式的类型,而不执行表达式。

#include <iostream>
using namespace std;int main()
{int x = 66;// y的类型被推断为:intdecltype(x++) y = 100;// x的值仍为:66cout << x << endl;return 0;
}

        2、保持表达式的引用和cv限定符(const/volatile)。decltype能准确地保留表达式的引用类型和cv限定符,这对于编写模板代码以及处理复杂的类型关系非常有用。

#include <iostream>
using namespace std;int main()
{int nNumber = 0;const int &nRef1 = nNumber;// nRef2是一个const int &类型decltype(nRef1) nRef2 = nNumber;nNumber = 66;// 输出:66cout << nRef2 << endl;return 0;
}

总结

        auto和decltype是C++ 11中增强类型安全、简化代码的重要工具,它们通过提供类型推断功能使得程序更加简洁易读,同时也提高了开发效率。熟练掌握这两种特性,有助于编写更高质量、更具扩展性的现代C++代码。

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

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

相关文章

python进程间使用共享内存multiprocessing.shared_memory来通讯

python多个进程通讯使用共享内存 1、multiprocessing.shared_memory ​ 使用这个模块可从进程直接访问共享内存,该模块提供了一个 SharedMemory 类,用于分配和管理多核或对称多处理器(SMP)机器上进程间的共享内存。 ​ 为了协助管理不同进程间的共享内存生命周期,multi…

leetcode-完全二叉树的节点个数

222. 完全二叉树的节点个数 题解&#xff1a; 使用递归的方法来解决这个问题。完全二叉树的节点个数可以通过以下公式计算&#xff1a; 节点个数 左子树节点个数 右子树节点个数 1&#xff08;根节点&#xff09; 首先&#xff0c;我们需要定义一个辅助函数countNodes(r…

RHCE 综合项目-博客

目录 业务需求 一、准备工作 1、配置静态IP 2、修改主机名及hosts映射 3、开启防火墙 4、时间同步 5、配置免密ssh登录 二、环境搭建 1、Server-web端安装LAMP环境软件 2、Server-NFS-DNS端上传博客软件 3、Server-NFS-DNS端设置NFS共享 三、Server-web设置 1、挂…

【代码随想录-链表】反转链表

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

OpenCV 2 - 矩阵的掩膜操作

1知识点 1-1 CV_Assert(myImage.depth() == CV_8U); 确保输入图像是无符号字符类型,若该函数括号内的表达式为false,则会抛出一个错误。 1-2 Mat.ptr(int i = 0); 获取像素矩阵的指针,索引 i 表示第几行,从0开始计行数。 1-3 const uchar* current = mylmage.ptr(row); 获得…

day26 节点操作——查找节点

目录 DOM节点查找节点父节点查找子节点查找兄弟关系查找 DOM节点 DOM节点&#xff1a; DOM树里每一个内容都称之为节点 节点类型&#xff1a; 元素节点&#xff1a;所有的标签&#xff0c;比如body、div html是根节点属性节点&#xff1a;所有的属性&#xff0c;比如href、cla…

计算机网络(第六版)复习提纲17

五 IP数据报的格式 1 IP数据报首部固定部分中的各字段 ①版本&#xff0c;占4位&#xff0c;指协议IP的版本 ②首部长度&#xff0c;占4位&#xff0c;范围是0-15&#xff0c;用于表示首部长度有几个4字节。由于固定长度部分长度位20字节&#xff0c;因此首部长度字段最小为5&…

1.26布雷斯悖论(设计做减法,使效率更高,netlogo模拟),自组织映射神经网络SOM

布雷斯悖论 红色的是普通道路&#xff0c;车越多通行时间越长 假定条件是 均衡状态就是两条路的通行时间相同 纳什均衡并不一定是全局最优 纳什均衡的关键就是单个个体做出改变时&#xff0c;只会使自己的利益受到损失&#xff0c;而不会使其他人发生改变 在达到纳什平衡时&…

让MySQL和Redis数据保持一致的4种策略

1 前言 先阐明一下 MySQL 和 Redis 的关系&#xff1a;MySQL 是数据库&#xff0c;用来持久化数据&#xff0c;一定程度上保证数据的可靠性&#xff1b;Redis 是用来当缓存&#xff0c;用来提升数据访问的性能。 关于如何保证 MySQL 和 Redis 中的数据一致&#xff08;即缓存…

DevSecOps 平台需求来源分析

目录 一、为什么要开展DevSecOps平台建设 1.1 产业发展的角度方面分析 1.2 企业内部角度分析 二、 DevSecOps平台建设需求来源 2.1 从外因看DevSecOps平台建设的需求来源 2.1.1 网络安全和数据合规在国内外快速发展 2.1.2 法规的落地促使安全管理的数字化和平台建设成为刚…

网安文件包含漏洞

文件包含概念&#xff1a; 开发人员通常会把可重复使用的函数写到单个文件中&#xff0c;在使用某些函数时&#xff0c;直接调用此文件&#xff0c;而无需再次编写&#xff0c;这种调用文件的过程一般被称为包含。为了使代码更加灵活&#xff0c;通常会将被包含的文件设置为变…

Flink CEP实现10秒内连续登录失败用户分析

1、什么是CEP&#xff1f; Flink CEP即 Flink Complex Event Processing&#xff0c;是基于DataStream流式数据提供的一套复杂事件处理编程模型。你可以把他理解为基于无界流的一套正则匹配模型&#xff0c;即对于无界流中的各种数据(称为事件)&#xff0c;提供一种组合匹配的…

Keepalived + DR 集群

目录 1、Keepalive VRRP 说明 故障切换 工作原理 核心组件 2、Keepalived DR 集群 拓扑规划 前期准备 配置 Httpd 服务 配置 Nginx 服务 配置 LVS 主 node_01 配置 LVS 从 node_02 测试 LVS 集群 测试主备切换 3、Keepalived 脑裂现象 4、Keepalived 心态检测 …

平安健康与中航健康时尚集团携手并进,共创会员制健康管理美好未来

近日&#xff0c;深圳市中航健康时尚集团股份有限公司(以下简称“中航健康时尚”)与平安健康正式达成战略合作。平安健康总裁吴军、中航健康时尚董事长王岚等领导出席签约仪式&#xff0c;就此次战略合作展开深入交流。 据了解&#xff0c;中航健康时尚集团创建于1995年&#x…

内存泄漏的原因及排查方法

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 随着网页应用的逐渐复杂化,内存管理也变得越来越重要。内存泄漏不仅会…

YUDIAN(宇电)温控器参数笔记(二)

没想到啊&#xff0c;时隔3年&#xff0c;我又用到了这个温控器&#xff0c;又来更新一下&#xff0c;因为我刚好要做一个简易的控温系统&#xff0c;类似于恒温水槽。 这个系统大概就是&#xff1a; 温控器用pt100测温&#xff0c;作为输入&#xff0c;输入连接到一个ssr上&a…

Start gtkmm 4 Programming (range controls)_

文章目录 基础解析 Chapter 7. Range Widgets https://gtkmm.org/en/documentation.htmlhttps://gnome.pages.gitlab.gnome.org/gtkmm-documentation/index.html 基础 容器: 容器小部件与其他小部件一样&#xff0c;派生自Gtk::Widget.例如Gtk::Grid可以容纳许多子小部件&…

C++进阶--C++11新的类功能和可变参数模板

C11新的类功能和可变参数模板 一、默认成员函数二、类成员变量初始化三、强制生成默认函数的关键字default四、禁止生成默认函数的关键字delete五、继承和多态中final与override关键字六、可变参数模板的概念七、可变参数模板的定义方式八、参数包的展开方式8.1 递归展开参数包…

vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)

概述&#xff1a;没有后端数据的前端&#xff0c;就失去了灵魂&#xff0c;由于本人没有写后端数据&#xff0c;所有调用黑马的&#xff0c;往下看相信对你会有收获的。 目录 第一步&#xff1a;安装axios 第二步&#xff1a;编写后端访问地址 第三步&#xff1a;编写具体的…