《深入理解C++11:C++11新特性解析与应用》笔记四

news2025/1/19 17:05:11

第四章 新手易学,老兵易用

4.1 右尖括号>的改进

在 C++98 中,有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >,那么它们之间需要一个空格来进行分隔,以避免发生编译时的错误。C++98 会将>>优先解析为右移。C++11 中,这种限制被取消了。事实上,C++11标准要求编译器智能地去判断在哪些情况下 >> 不是右移符号。

4.2 auto类型推导

4.2.1 静态类型、动态类型与类型推导

在 C++11 中,标准委员会决定赋予 auto 全新的含义,即auto 不再是一个存储类型指示符 ( storage-class-specifier,如 static、extern、thread local等都是存储类型指示符 ),而是作为一个新的类型指示符 ( type-specifier,如 int、float 等都是类型指示符)来指示编译器auto 声明变量的类型必须由编译器在编译时期推导而得。auto声明的变量必须被初始化,以使编译器能够从其初始化表达式中推导出其类型。

4.2.2 auto的优势

auto推导的优势:1.在拥有初始化表达式的复杂类型变量声明时简化代码。2.免除在一些类型声明时的麻烦,或者避免一些在类型声明时的错误。特别是在一些隐式或者用户自定义类型转换的情况。3.自适应性能够在一定程度上支持泛型的编程。这里举了一个例子:

Max2因为可以保存运算结果,提高了性能。而c++98标准中,因为无法获得a和b类型,因此只能实现Max1宏。

4.2.3 auto的使用细则

首先,c++11中,auto可以与指针和引用结合起来使用,效果符合c/c++程序员的想象。

其次,auto与volatile和const之间也存在着一些相互的联系。声明为auto的变量并不能从其初始化表达式中带走cv限制符。

此外,跟其他的变量指示符一样,同一个赋值语句中,auto可以用来声明多个变量的类型,不过这些变量的类型必须相同。

4种不能推导的情况:

1)对于函数fun来说,auto不能是其形参类型。

2)对于结构体来说,非静态成员变量的类型不能是auto的。

3)声明auto数组。auto z[3]这样的数组会被编译器禁止。

4)在实例化模板的时候使用auto作为模板参数。

为了避免和c++98中auto的含义发生混淆,c++11只保留auto作为类型指示符的用法

4.3 decltype

4.3.1 typeid与decltype

c完全不支持动态类型,c++98部分支持动态类型,也就是运行时类型识别(RTTI)。

RTTI机制为每个类型产生一个type_info类型的数据,程序员可以在程序中使用typeid随时查询一个变量的类型,typeid就会返回变量相应的type_info数据。而type_info的name成员函数可以返回类型的名字。而c++11中又曾佳乐hash_code这个成员函数,返回该类型唯一的哈希值,以供程序员对变量的类型随时进行比较。

除了typeid外,RTTI还包括c++中的dynamic_cast等特性。

事实上,在c++的发展中,类型推导是随着模板和泛型编程的广泛使用而引入的。

c++ 11对类型推导手段进行了细致的考量,最终标准化为了auto以及decltype。

decltype的类型推导总是以一个普通的表达式为参数,返回该表达式的类型。作为一个类型指示符,decltype可以将获得的类型来定义另外一个变量。decltype类型推导也是在编译时进行的。

4.3.2 decltype的应用

c++11中,比较典型的就是decltype与typedef/using的合用。

decltype在某些场景下,可以极大地增加代码的可读性。

在c++中,有时会遇到匿名类型,使用decltype可以重用匿名类型。

有了decltype可以适当扩大模板泛型的能力。

decltype在标准库中也有一些应用,例如基于decltype的模板类result_of,其作用是推导函数的返回类型。

4.3.3 decltype推导四规则

1.如果e是一个没有带括号的标记符表达式或类成员访问表达式,那么decltype(e)就是e所命名的实体的类型。此外,如果e是一个被重载的函数,则会导致编译时错误。

2.否则,假设e的类型是T,如果e是一个将亡值xvalue,那么decltype(e)为T&&。

3.否则,假设e的类型是T,如果e是一个左值,则decltype(e)为T&。

4.否则,假设e的类型是T,则decltype(e)为T。

标记符表达式 (id-expression ),基本上,所有除去关键字、字面量等编译器需要使用的标记之外的程序员自定义的标记 (token ) 都可以是标记符 (identifier )。而单个标记符对应的表达式就是标记符表达式。

4.3.4 cv限制符的继承与冗余的符号

与auto类型推导时不能带走cv限制符不同,decltype能够带走表达式的cv限制符。不过,如果对象的定义中有const或volatile限制符,使用decltype进行推导时,其成员不会继承const或volatile限制符。

与auto相同,decltype从表达式推导出类型后,进行类型定义时,也会允许一些冗余的符号。比如cv限制符及引用符号&,通常如果推导出的类型已经有了这些属性,冗余的符号则会被忽略。

4.4 追踪返回类型

4.4.1 追踪返回类型的引入

c++98中,如果一个函数模板的返回类型依赖于实际的入口参数类型,那么该返回类型在模板实例化之前可能都无法确定,这样的话在定义函数模板时就会遇到麻烦。

最直观的解决方式时对返回类型进行类型推导。

编译器在推导decltype(t1+t2)时,表达式t1和t2都未声明,为了解决这个问题,c++11引入新语法--追踪返回类型,来声明和定义这样的函数。

auto占位符和->return_type构成追踪返回类型函数的两个基本元素。

4.4.2 使用追踪返回类型的函数

4.5 基于范围的for循环

对于一个有范围的集合,说明循环的范围是多余的。可以使用基于范围的for循环来遍历:

如果不需要修改迭代变量的值,也可以不使用引用:

使用auto可以更简练:

使用for循环迭代要求范围是确定的,数组大小不能确定,是不能使用基于范围的for循环,例如:

例子里,作为参数传过来的数组a的范围不能确定。

基于范围的循环使用标准库容器时,如果使用auto来声明迭代的对象时,这个对象不是迭代器对象,而是解引用后的对象。

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

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

相关文章

uni-app condition启动模式配置

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

【Python】python 截取特定字符串前面的内容

Python截取特定字符串前面的内容 简介 本文将教会初学者如何使用Python来截取特定字符串前面的内容。Python提供了强大的字符串处理功能,可以轻松地实现这个需求。下面是整个流程的步骤: 在截取特定字符串前面的内容之前,我们首先需要找到要截取的特定内容的位置。我们可以使…

PHP的Laravel的数据库迁移

1.默认迁移文件 2.数据库迁移 在终端输入以下代码 php artisan migrate 我的报错啦!!!!! 数据库里面只有两张表,实际上应该有四张的!!! 解决方法: 反正表已…

ASUS华硕ROG幻16 2023款GU603VU VV VI笔记本电脑原厂Win11.22H2系统

链接:https://pan.baidu.com/s/1AgevUZleCHBJgCBcIp5CFQ?pwdhjxy 提取码:hjxy 华硕笔记本2023款幻16原厂Windows11系统自带所有驱动、出厂主题壁纸、Office办公软件、MyASUS华硕电脑管家、Armoury Crate奥创控制中心等预装程序 文件格式&#xff1…

【日志系列】什么是分布式日志系统?

✔️什么是分布式日志系统? 现在,很多应用都是集群部署的,一次请求会因为负载均衡而被路由到不同的服务器上面,这就导致一个应用的日志会分散在不同的服务器上面。 当我们要向通过日志做数据分析,问题排查的时候&#…

室内设计师效果图云渲染好?还是本地渲染好?

室内设计师在设计项目中经常面临一个关键的技术选择:使用云渲染服务或本地渲染完成效果图渲染呢?每种方式都有其独的优势与不足,且影响整个设计的完成速度、质量和成本。当然还有部分人群不知道云渲染是什么?本文整理关于云渲染的…

MySQL GTID 主从错误

错误 搭建主从出现以下错误 Last_IO_Error: The replication receiver thread cannot start because the master has GTID_MODE OFF and this server has GTID_MODE ON. 原因 MySQL主从的 Master 和 Slave 必须 同时开启或者关闭 enforce-gtid-consistency和 gtid-mode 功能…

k8s的二进制部署和网络类型

k8s的二进制部署 master01:192.168.233.10 kube-apiserver kube-controller-manager kube-scheduler etcd master02:192.168.233.20 kube-apiserver kube-controller-manager kube-scheduler node01:192.168.233.30 kubelet kube-proxy etc…

java并发编程六 ReentrantLock,锁的活跃性

多把锁 一间大屋子有两个功能:睡觉、学习,互不相干。 现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低 解决方法是准备多个房间(多个对象锁&#xf…

echart地图的小demo12.27

图形&#xff1a; DataV.GeoAtlas地理小工具系列 点击以上链接进入--》 再点击箭头---》复制坐标到文件&#xff1a; 取名为 china.json中 &#xff08;文件名自定义&#xff09; <template><div class"map" ref"chartMap">地图</div>…

【Pytorch】学习记录分享9——PyTorch新闻数据集文本分类任务实战

【Pytorch】学习记录分享9——PyTorch新闻数据集文本分类任务 1. 认为主流程code2. NLP 对话和预测基本均属于分类任务详细见3. Tensorborad 1. 认为主流程code import time import torch import numpy as np from train_eval import train, init_network from importlib impo…

Neural Networks 期刊投稿指南

一 简介 这是国际神经网络学会、欧洲神经网络学会和日本神经网络学会的官方期刊。 论文类型 文章&#xff1a; 原创的、全文长度的文章将被考虑&#xff0c;前提是它们除了摘要形式外尚未发表&#xff0c;并且没有同时在其他地方进行审查。作者可以自愿但不是必须建议一位编辑…

<JavaEE> TCP 的通信机制(二) -- 连接管理(三次握手和四次挥手)

目录 TCP的通信机制的核心特性 三、连接管理 1&#xff09;什么是连接管理&#xff1f; 2&#xff09;“三次握手”建立连接 1> 什么是“三次握手”&#xff1f; 2> “三次握手”的核心作用是什么&#xff1f; 3&#xff09;“四次挥手”断开连接 1> 什么是“…

NineData产品功能重点发布(11月下+12月上)

12 月上半月 1.1 SQL 任务支持 MongoDB 介绍&#xff1a;SQL 任务功能已支持 MongoDB 数据源&#xff0c;可以通过 SQL 任务发起对 MongoDB 的变更申请&#xff0c;支持立即执行或定时执行。 场景&#xff1a; 安全变更&#xff1a;需要对企业成员提交的数据变更进行预审的场…

「Kafka」入门篇

「Kafka」入门篇 基础架构 Kafka 快速入门 集群规划 集群部署 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html 解压安装包&#xff1a; [atguiguhadoop102 software]$ tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module/修改解压后的文件名称&#xff1a; [a…

哪个品牌的运动耳机比较好?蓝牙无线运动耳机推荐

​在运动时&#xff0c;一副合适的耳机能够让你的运动体验提升到一个新的层次。运动耳机需要具备耐用性、稳定性和优秀的音质&#xff0c;以适应各种运动场景。考虑到这些要求&#xff0c;我将为大家推荐几款在运动场景中表现优异的耳机&#xff0c;它们将是你运动时的理想伴侣…

PowerShell对象——数据的另一个名称

PowerShell对象—数据的另一个名称 实验 要求&#xff1a;需要运行PowerShell v3 或更新版本PowerShell的计算机 任务&#xff1a; 找出生成随机数字的Cmdlet 找出显示当前时间和日期的Cmdlet 任务#2的Cmdlet产生的对象类型是什么&#xff1f;&#xff08;由Cmdlet产生的对…

【Linux基础开发工具】Linux调试器-gdb

目录 前言 1. 背景 2. 基本使用 总结 前言 GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的开源调试器&#xff0c;它用于调试C、C等程序&#xff0c;在Linux环境下软件开发的过程中&#xff0c;调试是一个至关重要的环节。无论是在开发新的软件还是维护现有的代…

linux cuda环境搭建

1&#xff0c;检查驱动是否安装 运行nvidia-smi&#xff0c;如果出现如下界面&#xff0c;说明驱动已经安装 记住cuda版本号 2&#xff0c;安装cudatoolkit 上官网CUDA Toolkit Archive | NVIDIA Developer 根据操作系统选择对应的toolkit 如果已经安装了驱动&#xff0c;选…

Visual Studio 2013 中创建一个基于 Qt 的动态链接库:并在MFC DLL程序中使用

在本地已经安装好 Qt 的情况下&#xff0c;按照以下步骤在 Visual Studio 2013 中创建一个基于 Qt 的动态链接库&#xff1a; 一、新建 Qt 项目&#xff1a; 在 Visual Studio 中&#xff0c;选择 “文件” -> “新建” -> “项目…”。在 “新建项目” 对话框中&#…