《深入理解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.rhkb.cn/news/226036.html

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

相关文章

MidJourney笔记(9)-daily_theme-docs-describe

/daily_theme 切换 #daily-theme 频道更新的通知。 但我发现在对话框那里,是没有这个命令的: 但官网是有介绍,不知道是不是版本问题还是这个命令已经无效。 但后来,我发现这个命令是要在Midjourney服务对话框那里才有,在我们后面添加的Mid

Linux的账号及权限管理

一.管理用户账号 1.1 用户账户的分类 1.1.1 用户账号的分类 超级用户:(拥有至高无上的权利) root用户是Linux操作系统中默认的超级用户账号,对本主机拥有最高的权限,系统中超级用户是唯一的。普通用户: …

2023年12月电子学会Scratch图形化编程一级真题及答案

2023年12月电子学会Scratch图形化编程一级真题及答案 一、单选题(共25题,共50分) 1. 观察下列每个圆形中的四个数,找出规律,在括号里填上适当的数?( ) A. 9 B. 17 C. 21 D. 5 试题编号:202306…

信息网络协议基础-IPv6协议

文章目录 概述为什么引入IP服务模型IPv4的可扩展性问题解决方法***CIDR(Classless Inter-Domain Routing, 无类别域间寻路)前缀汇聚***前缀最长匹配***NAT(网络地址转换)存在的问题解决方案路由表配置***局限性IPv6协议头标IPv6地址表示前缀类型单播地址链路局部地址(Link-Loca…

第十二章:实验案例:使用rsync构建镜像网站

实验环境 某公司在深圳、北京两地各放置了---台网站服务器,分别应对南北大区内不断增长的客户访问需求.两台服务器的网站文档必须保持--致,如图12.3所示,同步链路已通过VPN专用线路实现。 需求描述 1,服务器A(北京〉…

k8s快速搭建

VMware16Pro虚拟机安装教程VMware16.1.2安装及各版本密钥CentOS7.4的安装包:提取码:lp6qVMware搭建Centos7虚拟机教程 搭建完一个镜像 关机 拍摄一个快照,克隆两个作为子节点 0. 环境准备 在开始之前,部署Kubernetes集群机器需要满足以下几个条件&#…

使用Python Flask搭建一个简单的Web站点并发布到公网上访问

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务,本期教程…

【linux】touch的基本使用

碎碎念 刚接触linux时候的几个最基础的命令之一,用来创建文件。如果使用touch --help的时候会发现作者对于touch的简介:Update the access and modification times of each FILE to the current time.用于修改文件的访问和时间戳 带我的leader属于那种…

Mediapipe绘制实时3d铰接骨架图——Mediapipe实时姿态估计

一、前言 大约两年前,基于自己的理解我曾写了几篇关于Mediapipe的文章,似乎帮助到了一些人。这两年,忙于比赛、实习、毕业、工作和考研。上篇文章已经是一年多前发的了。这段时间收到很多私信和评论,请原谅无法一一回复了。我将尝…

vue3老项目如何引入vite

vue3老项目如何引入vite 安装 npm install vite vitejs/plugin-vue --save-dev Vite官方中文文档修改package.json文件 在 npm scripts 中使用 vite 执行文件 "scripts": {"serve": "vite","build": "vite build","pr…

关于Redis面试题

前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv Redis 是什么 全名:远程字典服务。这是一个开源的在内存中的数据结构存…

一、C++简介

C语言的发展史 1983年,贝尔实验室(Bell Labs)的Bjarne Stroustrup发明了C。 C在C语言的基础上进行了扩充和完善,是一种面向对象程序设计(OOP)语言。 Stroustrup说:“这个名字象征着源自于C语言变…

模式识别与机器学习-SVM(线性支持向量机)

线性支持向量机 线性支持向量机间隔距离学习的对偶算法算法:线性可分支持向量机学习算法线性可分支持向量机例子 谨以此博客作为复习期间的记录 线性支持向量机 在以上四条线中,都可以作为分割平面,误差率也都为0。但是那个分割平面效果更好呢&#xff1…

Postman常见问题及解决方法

1、网络连接问题 如果Postman无法发送请求或接收响应,可以尝试以下操作: 检查网络连接是否正常,包括检查网络设置、代理设置等。 确认请求的URL是否正确,并检查是否使用了正确的HTTP方法(例如GET、POST、PUT等&#…

Linux操作系统——进程(六) 进程地址空间

进程地址空间 C/C程序员一般将我们所写的程序看成如下这种结构: 我们所写的程序通过编译编译之后就可以以这样的方式进行分布. 我们先通过编写一段C语言代码来进行验证: 运行结果: 我们可以看出来上述地址遵循的就是我们上面画的一种结构。…

H5向微信小程序发送信息(小程序web-view打开H5)

引入weixin-js-sdk npm i weixin-js-sdk 页面引入 // 引入wxjsimport wx from "weixin-js-sdk"; 点击触发方法 methods: {goweap(id){console.log(wx);// H5传递数据 (navigateBack)wx.miniProgram.navigateBack({delta: 1});wx.min…

探究element-ui 2.15.8中<el-input>的keydown事件无效问题

一、问题描述 今天看到一个问题&#xff0c;在用Vue2element-ui 2.15.8开发时&#xff0c;使用input组件绑定keydown事件没有任何效果。 <template><div id"app"><el-input v-model"content" placeholder"请输入" keydown&quo…

播放海康摄像头直播流使用笔记

1、将海康摄像头绑定到萤石云平台&#xff0c;并查看直播流 2、项目中使用 1、安装hls cnpm i hls.js 2、封装组件&#xff08;在components文件夹下新建bodyCapture文件夹下index.vue&#xff09; <template><el-dialogtitle"遗体抓拍"class"bo…

gin框架使用系列之六——自定义中间件

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》《gin框架使用系列之五——表单校验》 一、gin中间件概述 gin中将…

C语言实验1:C程序的运行环境和运行C程序的方法

一、算法原理 这是学C语言的入门&#xff0c;并不需要很高深的知识&#xff0c;一个hello world 或者一个简单的加法即可 二、实验要求 了解所用的计算机系统的基本操作方法&#xff0c;学会独立使用该系统。 了解在该系统上如何编辑、编译、连接和运行一个C程序。 通过运…