《深入理解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.mfbz.cn/a/275605.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【量化】蜘蛛网策略复现

文章目录 蜘蛛网策略研报概述持仓数据整理三大商品交易所的数据统一筛选共有会员清洗数据计算研报要求数据全部代码 策略结果分析无参数策略有参数策略正做反做 MSD技术指标化 蜘蛛网策略 策略来自《东方证券-股指期货趋势交易之蜘蛛网策略——从成交持仓表中捕捉知情投资者行为…

腾讯云轻量应用服务器详细介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器,CPU内存带宽配置高并且价格特别优惠,轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年,540元三年、2核4G5M带宽218元一年,756元3年、4核8G12M带宽646元15个月等&#xf…

Linux操作系统:LVM与磁盘配额

目录 一、LVM逻辑卷管理基础 1、LVM逻辑卷管理的概念 2、LVM逻辑卷管理的核心组件 3、LVM逻辑卷管理的优势 4、LVM逻辑卷管理的命令 4.1 扫描命令的用法 4.1.1 pvscan 4.1.2 vgscan 4.1.3 lvscan 4.2 查看命令的用法 4.2.1 pvdisplay 4.2.2 vgdisplay 4.2.3 lvdis…

12.27_黑马数据结构与算法笔记Java(补2)

目录 279 0-1 背包问题 动态规划 实现 280 0-1 背包问题 动态规划 降维 281 完全背包问题 动态规划 分析 282 完全背包问题 动态规划 实现 283 零钱兑换问题 动态规划 分析 284 零钱兑换问题 动态规划 实现 285 零钱兑换问题 动态规划 降维 286 零钱兑换II 动态规划 分析…

【idea】运行工程时候卡了许久Java Method Breakpoints

老以为是数据库连接不上,此问题概率性小,操作上面不小心打了断点… 应该是打断点的时候,打到了方法上面,去掉哟 Java Method Breakpoints

C++day2作业

把课上strcut的练习&#xff0c;尝试着改成class #include <iostream>using namespace std; class Stu { private:int age;string sex;int hign; public:int soce;void get_information();void set_information(); }; void Stu::set_information() {static Stu s1;cout …

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

「从红月开始」运输公司遭精神污染,小十七救哥哥,事发地陷危机

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《从红月开始》第3集超前爆料&#xff0c;本次透露陆辛首次被派遣去调查精神污染的任务。他的目的地是四方运输公司&#xff0c;一个主要由亡命之徒组成的组织。他们表面上从事运输业务&#xff0c;但背地里进行偷渡和走私活动。 …

【CSAPP】探究BombLab奥秘:Phase_2的解密与实战

&#x1f4cb; 前言 ​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音&#xff1a;桃花灼灼春风暖&#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑&#xff0c;岁月长河任舟游。 ​ &#x1f389;欢迎…

cnPuTTY 0.80.0.1—PuTTY Release 0.80中文版本简单说明~~

2023-12-18 官方发布了PuTTY 0.80本次发布主要是针对Terrapin攻击(CVE-2023-48795)的修改发布。 更多详细的内容请查看PuTTY Change Log。 有关Terrapin攻击可用简单参考&#xff1a;警告&#xff01;&#xff01;&#xff01;Terrapin攻击(CVE-2023-48795)~~~ 为了缓解此漏洞…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…

在线客服系统推荐:提升客户满意度与工作效率的利器

客服系统分为售前和售后&#xff0c;售前客户系统是为了能够及时解决客户在购买产品前的问题&#xff0c;通过客服人员让客户了解产品的功能点是能够满足他们的需求点&#xff0c;从未达到转化的目的。 而售后客户系统主要是提供给购买后的客户强大的产品售后支持&#xff0c;…

PiflowX组件-DataGen

DataGen组件 组件说明 按数据生成规则模拟数据。在开发和演示场景下使用比较方便。具体可以查看Flink官方DataGen connector。 计算引擎 flink 有界性 字段的数据全部生成完成后&#xff0c;source 就结束了。 因此&#xff0c;有界性取决于字段的有界性。 组件分组 co…

SQL Server 索引和视图

CSDN 成就一亿技术人&#xff01; 难度指数&#xff1a;* * * CSDN 成就一亿技术人&#xff01; 目录 1.索引 什么是索引&#xff1f; 索引的作用&#xff1f; 索引的分类 1. 唯一索引 2. 主键索引 3. 聚集索引 4.非聚集索引 5.复合索引 6.全文搜索 索引的创建&am…

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

C语言—每日选择题—Day64

前言 两天没更新了&#xff0c;作者在复习期末考试&#xff0c;更新一波&#xff0c;祝大家都能顺利通过期末考试&#xff01;&#xff01;&#xff01; 指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博…

javaWebssh民宿管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh民宿管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模 式开发。开发环境为TOMCAT7.0,My…

【高可用】使用Keepalived实现SFTP服务的高可用

使用Keepalived实现SFTP服务的高可用 背景 这个事情的背景是生产环境的数据采集流程时不时会出问题&#xff08;这个也是不可避免的&#xff09;&#xff0c;目前的处理手段是&#xff1a;所有的数据接口服务器&#xff08;也就是存放原始数据等待采集的服务器&#xff09;都…

完全背包问题,原理剖析,公式推导,OJ详解

文章目录 前言一、完全背包的状态设计1、状态设计2、状态转移方程3、对比0/1背包问题4、时间复杂度分析 二、完全背包问题的优化1、时间复杂度优化2、空间复杂度优化 三、OJ练习裸题完全背包离散化最小值 前言 完全背包问题&#xff0c;相比0/1背包问题&#xff0c;实就每个物品…
最新文章