《深入理解C++11:C++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.mzph.cn/news/582135.shtml

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

相关文章

ubuntu22下安装minconda

bing 搜索 canda install 找到官方网站 https://docs.conda.io/projects/miniconda/en/latest/ 这里我们安装minconda。 官网有安装方法。 mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh…

【K8S 二进制部署】部署单Master Kurbernetes集群

目录 一、基本架构和系统初始化 1、集群架构: 2、操作系统初始化配置: 2.1、关闭防火墙和安全机制: 2.2、关闭swap 2.3、根据规划设置主机名 2.4、三台主机全部互相映射 2.5、调整内核参数 3、时间同步(所有节点时间必须同…

考研结束,以下事情要抓紧做了!

Hello,大家好,我是 Sunday。 首先恭喜大家考研结束,也在这里祝各位考研的同学们可以 成功上岸 ✿✿ヽ(▽)ノ✿。 不过,考试结束并不是一个终点,而是另外一个新的起点。摆在大家面前的,还有很多新的问题&a…

百度CTO王海峰:飞桨开发者已达1070万

目录 写在前面 飞桨开发者已达1070万 文心一言用户规模破亿,日提问量快速增长 写在前面 “文心一言用户规模突破1亿。”12月28日,百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰在第十届WAVE SUMMIT深度学习开发者大会上宣布。会上&…

【AIGC_MIDJOURNEY】专业提示词+配图分析

prompt : landscape of beautiful forest, lush foliage and water falls, crystal clear lake, fire flies, twinkling lights , rococo, art nouveau, --ar 16:9 这个提示词描述了一个美丽的森林景观,包括茂密的植被和瀑布,清澈见底的湖泊,…

干货!一文详解车间管理的五大基本方法

车间管理是制造型企业生产过程中的重要环节,它直接影响着企业的生产效率、成本控制、产品质量以及员工的士气与工作效率。优秀的车间管理不仅能够提升产品的质量和生产力,还能降低运营成本,从而在激烈的市场竞争中为企业赢得优势。 为了帮助…

vue3-13

token可以是后端api的访问依据,一般绝大多数时候,前端要访问后端的api,后端都要求前端请求需要携带一个有效的token,这个token用于用户的身份校验,通过了校验,后端才会向前端返回数据,进行相应的操作,如果没…

Linux的LVM与磁盘配额

一.LVM 1.什么是LVM Logical Volume Manager 逻辑卷管理 能够在保持现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件,不能基于LVM创建 解释:就是将多个不同的物理卷组合在一起形…

Python高级用法:迭代器(iter)

迭代器 迭代器是一个实现了迭代器协议的容器对象。它基于以下两个方法。 __ next __:返回容器的下一个元素。 __ iter __:返回迭代器本身 迭代器可以利用内置的iter函数和一个序列来创建, 假设我们的序列为[1, 2, 3],迭代器创建过程如下: i…

读取无标题列表txt文本文件

文件如下: 使用pandas直接读取,有多少条数据,就会读出来多少列: import pandas as pdfilepath/Users/。。。/ file1失败名单.txt df1pd.read_csv(filepathfile1,sep,,headerNone) 会打印出无数列数据: 使用open方法读…

31.Java程序设计-基于Springboot的鲜花商城系统的设计与实现

引言 背景介绍:鲜花商城系统的兴起和发展。研究目的:设计并实现一个基于Spring Boot的鲜花商城系统。论文结构概述。 文献综述 回顾相关鲜花商城系统的设计与实现。分析不同系统的优缺点。强调Spring Boot在系统设计中的优越性。 系统设计 需求分析 用户…

优秀数据库开发工具Navicat Premium 16 Mac/win中文版

Navicat Premium 16作为一款综合性的数据库开发工具,可以支持主流的数据库管理系统,如MySQL、MariaDB、Oracle、SQL Server等。无论是进行数据库建模、数据导入导出、SQL脚本编辑,还是数据同步、备份恢复等操作,Navicat Premium 1…

【Vulnhub 靶场】【Hms?: 1】【简单】【20210728】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/hms-1,728/ 靶场下载:https://download.vulnhub.com/hms/niveK.ova 靶场难度:简单 发布日期:2021年07月28日 文件大小:2.9 GB 靶场作者:niveK 靶场系…

【产品经理】axure中继器的使用——表格增删改查分页实现

笔记为个人总结笔记,若有错误欢迎指出哟~ axure中继器的使用——表格增删改查分页实现 中继器介绍总体视图视频预览功能1.表头设计2.中继器3.添加功能实现4.删除功能实现5.修改功能实现6.查询功能实现7.批量删除 中继器介绍 在 Axure RP9 中,中继器&…

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

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

【轻松入门】OpenCV4.8 + QT5.x开发环境搭建

引言 大家好,今天给大家分享一下最新版本OpenCV4.8 QT5 如何一起配置,完成环境搭建的。 下载OpenCV4.8并解压缩 软件版本支持 CMake3.13 或者以上版本 https://cmake.org/ VS2017专业版或者以上版本 QT5.15.2 OpenCV4.8源码包 https://github.com/op…

C# 学习网站

C# 文档 - 入门、教程、参考。 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/ Browse code samples | Microsoft LearnGet started with Microsoft developer tools and technologies. Explore our samples and discover the things you can build.http…

SpingBoot的项目实战--模拟电商【1.首页搭建】

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.项目背景及技术点运用 …

C++ 一个有bug的贪吃蛇。。。。。。。。

C 一个有bug的贪吃蛇。。。。。。。。 #include <graphics.h> #include<Windows.h> #include<Mmsystem.h> #include<conio.h> #include<time.h> #include<stdio.h> #include<easyx.h> using namespace std; #pragma warning(di…

Qt之自定义分页(翻页)控件

当数据量较大时,分页显示是个不错的选择。这里用百家姓来演示分页效果,包括首页、上一页、下一页、尾页和跳转。 一.效果 每页15个姓氏。 二.实现 QHPageWidget.h #ifndef QHPAGEWIDGET_H #define QHPAGEWIDGET_H#include <QWidget> #include <QStandardItemMod…