14-2(C++11)类型推导、类型计算

14-2(C++11)类型推导、类型计算

  • 类型推导
    • auto关键字
    • auto类型推断本质
    • auto与引用 联用
    • auto关键字的使用限制
  • 类型计算
    • 类型计算分类
    • 与类型推导相比
    • 四种类型计算的规则
    • 返回值后置

类型推导

auto关键字

  • C++98中,auto表示栈变量,通常省略不写
  • C++11中,给auto赋予新的语义,表示自动类型推导
    • 既根据对变量进行初始化时所使用的数据的类型,由编译器自动推导出所定义变量的实际类型
      在这里插入图片描述

auto类型推断本质

  • 按照定义独立对象并根据初始化数据的类型进行推导
  • 无法自动推断 const,只能在auto的上下文显示指明
  • 如果给出的 初始化数据类型为常量指针,则可以自动推导const
// 类型推导不是类型照抄
#include <iostream>
#include <typeinfo>
using namespace std;int main( void ){int a = 10;const int b = 10;auto c = a;// auto: int      c: intcout << "c的类型:" << typeid(c).name() << endl; // icout << "&c: " << &c << ", &a: " << &a << endl; // 地址不同c++; // 允许更改auto d = b;// auto: int      d: intcout << "d的类型:" << typeid(d).name() << endl; // icout << "&d: " << &d << ", &b: " << &b << endl; // 地址不同d++; // 允许更改const auto e = b;// auto: int      e: const intcout << "e的类型:" << typeid(e).name() << endl; // icout << "&e: " << &e << ", &b: " << &b << endl; // 地址不同
//  e++; // 不允许更改auto f = &b; // 如果初始化数据的类型是常量指针,则可以自动推导const(第一种可以自动推导const的情况)// auto: const int*      f: const int*cout << "f的类型:" << typeid(f).name() << endl; // PKi 
//  *f = 666;f = NULL;return 0;
} 

auto与引用 联用

  • 按照定义独立对象并根据初始化数据的类型进行推导,所以不可能推导出引用
  • 除非auto的上下文指明按照引用推导
  • 若指明按引用推导并且目标带有常属性,则可以自动推导const
// 类型推导和引用联用
#include <iostream>
#include <typeinfo>
using namespace std;int main( void ){int a = 10;const int b = 10;auto c = a;// auto: int      c: intcout << "c的类型:" << typeid(c).name() << endl; // icout << "&c: " << &c << ", &a: " << &a << endl; // 地址不同c++; // 允许更改auto& d = a;// auto: int  d: int&cout << "d的类型:" << typeid(d).name() << endl; // icout << "&d: " << &d << ", &a: " << &a << endl; // 地址相同d++; // 允许更改auto& e = b; // 如果指明按引用推导,并且目标带有常属性,则也可以自动推导出const(这是第二种自动推导出const的情况)// auto: const int   e: const int&cout << "e的类型:" << typeid(e).name() << endl; // icout << "&e: " << &e << ", &b: " << &b << endl; // 地址相同
//  e++; // 不允许更改return 0; 
} 

auto关键字的使用限制

  • 函数形参类型无法推导(C++14标准支持)
  • 类的成员变量无法推导
// 类型推导的局限性
#include <iostream>
#include <typeinfo>
using namespace std;
/*
void foo(auto v){// ...
}
*/
/*
class A{
public:auto a; // 声明auto b; // 声明
};
*/int main( void ){
//  foo(10);
//  foo(3.14);return 0; 
} 

类型计算

类型计算分类

  • C语言: sizeof - 计算类型的大小
  • C++语言: typeid - 可以获取类型的信息字符串
  • C++11: decltype - 获取参数表达式的类型

注意事项:类型计算由编译器确定,并不是运行期确定

与类型推导相比

  • 对类型的确定更加精准
const int a = 10;
auto b = a; // b类型推导为int
decltype(a) c = a; //c类型计算为 const int
  • 可以做到类型相同但值不同
const int a = 10:
auto b=a;
decltype(a) c = 100;
// 类型推导和类型计算的比较
#include <iostream>
#include <typeinfo>
using namespace std;int main( void ){const int a = 10;auto b = a;// auto : int  b : intcout << "b的类型:" << typeid(b).name() << endl; // icout << "&b: " << &b << ", &a:" << &a << endl; // 地址不同b++; // 允许更改// 类型计算比类型推导在类型的确定上会更加精准decltype(a) c = 666;// = a;// c: const intcout << "c的类型:" << typeid(c).name() << endl; // i cout << "&c: " << &c << ", &a:" << &a << endl; // 地址不同
//  c++; // 不允许更改return 0; 
} 

四种类型计算的规则

  • 标识符表达式,直接取表达式的类型
  • 函数表达式,取函数返回值的类型
  • 其他表达式
    • 如果表达式的值为左值,则取左值引用的类型
    • 如果表达式的值为右值,则取该右值本身的类型
// 四种类型计算的规则
#include <iostream>
#include <typeinfo>
using namespace std;double foo();int main( void ){int a = 10;// 如果给decltype传递的是标识符表达式,则编译器根据标识符的类型,作为最终计算出的类型decltype(a) c = a;// c: intcout << "c的类型:" << typeid(c).name() << endl; // icout << "&c:" << &c << ", &a:" << &a << endl; // 地址不同c++; // 允许更改// 如果给decltype传递的是函数表达式,则编译器根据函数的返回值的类型,作为最终计算出的类型decltype(foo()) d = a;// d: doublecout << "d的类型:" << typeid(d).name() << endl; // dcout << "&d:" << &d << ", &a:" << &a << endl; // 地址不同d++; // 允许更改// 如果是其它表达式,并且表达式结果为左值,则编译器取该左值引用的类型,作为最终计算出的类型decltype(++a) e  = a;// e: int&cout << "e的类型:" << typeid(e).name() << endl; // icout << "&e:" << &e << ", &a:" << &a << endl; // 地址相同e++; // 允许更改// 如果是其它表达式,并且表达式结果为右值,则编译器取该右值本身的类型,做为最终计算出的类型decltype(a++) f = a;// f: intcout << "f的类型:" << typeid(f).name() << endl; // icout << "&f:" << &f << ", &a:" << &a << endl; // 地址不同f++; // 允许更改 return 0; 
} 

返回值后置

auto 函数名 (形参表) ->decltype(表达式)

#include <iostream>
#include <typeinfo>
using namespace std;auto foo(int x, double y) -> decltype(x+y){return x + y;
}int main( void ){auto f = foo(3,3.14);cout << "f的类型:" << typeid(f).name() << endl;return 0; 
} 

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

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

相关文章

Leetcode刷题笔记题解(C++):25. K 个一组翻转链表

思路&#xff1a;利用栈的特性&#xff0c;K个节点压入栈中依次弹出组成新的链表&#xff0c;不够K个节点则保持不变 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

在国内,现在月薪1万是什么水平?

看到网友发帖问&#xff1a;现在月薪1W是什么水平&#xff1f; 在现如今的情况下&#xff0c;似乎月薪过万这个标准已经成为衡量个人能力的一个标准了&#xff0c;尤其是现在互联网横行的时代&#xff0c;好像年入百万&#xff0c;年入千万就应该是属于大众的平均水平。 我不是…

kafka入门(四):消费者

消费者 (Consumer ) 消费者 订阅 Kafka 中的主题 (Topic) &#xff0c;并 拉取消息。 消费者群组&#xff08; Consumer Group&#xff09; 每一个消费者都有一个对应的 消费者群组。 一个群组里的消费者订阅的是同一个主题&#xff0c;每个消费者接收主题的一部分分区的消息…

大师学SwiftUI第18章Part2 - 存储图片和自定义相机

存储图片 在前面的示例中&#xff0c;我们在屏幕上展示了图片&#xff0c;但也可以将其存储到文件或数据库中。另外有时使用相机将照片存储到设备的相册薄里会很有用&#xff0c;这样可供其它应用访问。UIKit框架提供了如下两个保存图片和视频的函数。 UIImageWriteToSavedPh…

JAVA后端自学技能实操合集

JAVA后端自学技能实操 内容将会持续更新中,有需要添加什么内容可以再评论区留言,大家一起学习FastDFS使用docker安装FastDFS(linux)集成到springboot项目中 内容将会持续更新中,有需要添加什么内容可以再评论区留言,大家一起学习 FastDFS 组名&#xff1a;文件上传后所在的 st…

leetcode 100.相同的树

涉及到递归&#xff0c;最好多画图理解&#xff0c;希望对你们有帮助 100.相同的树 题目 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 题目链接…

GPIO的使用--滴答定时器--pir人体红外传感器

目录 一、滴答定时器的使用与原理 1、定义 2、原理 &#xff08;1&#xff09;向上计数​编辑 &#xff08;2&#xff09;向下计数 &#xff08;3&#xff09; 代码流程 a、配置滴答时钟唤醒频率 b、滴答时钟中断函数 &#xff08;4&#xff09;结果 3、优化-->寄存…

读书笔记-《数据结构与算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通过构建有序序列&#xff0c;对于未排序序列&#xff0c;在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历)&#xff0c;找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间) 从第一个元素开始&#xff0c;该元素可…

如何主持一场知识竞赛抢答赛

知识竞赛主持说难不难&#xff0c;说简单也不简单&#xff0c;我就从易到难介绍一下。 入门级&#xff0c;题主不用练习太多其他花哨的技巧&#xff0c;只要注意一点&#xff0c;熟悉比赛流程。知识竞赛需要给所有选手一个公平流畅的答题环境&#xff0c;所以题主自身必须非常…

干货!接口中的大事务,该如何进行优化?

作为后端开发的程序员&#xff0c;我们常常会的一些相对比较复杂的逻辑&#xff0c;比如我们需要给前端写一个调用的接口&#xff0c;这个接口需要进行相对比较复杂的业务逻辑操作&#xff0c;比如会进行&#xff0c;查询、远程接口或本地接口调用、更新、插入、计算等一些逻辑…

掌握iText:轻松处理PDF文档-进阶篇

简体中文写入 iText本身对简体中文的支持有限&#xff0c;但可以通过引入额外的字体包来增强其对简体中文的支持。例如&#xff0c;可以使用iTextAsian.jar这个亚洲字体包&#xff0c;它包含了几种简单的亚洲字体&#xff0c;其中包括简体中文字体。只需要将iTextAsian.jar放到…

46. 全排列

46. 全排列 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;_46全排列_构建数组回溯_46全排列_直接构建 错误经验吸取 原题链接&#xff1a; 46. 全排列 https://leetcode.cn/problems/permutations/description/ 完成情况&#xff1a;…

小模型学习(1)-人脸识别

【写作背景】因为最近一直在研究大模型&#xff0c;在与客户进行交流时&#xff0c;如果要将大模型的变革性能力讲清楚&#xff0c;就一定要能将AI小模型的一些原理和效果讲清楚&#xff0c;进而形成对比。当然这不是一件简单的事情&#xff0c;一方面大模型分析问题的的本质原…

反射加载SDK完成统一调用

文章目录 1、需求背景2、接口抽象类具体实现类3、疑问4、存在的问题5、通过反射加载SDK并完成调用5、补充&#xff1a;关于业务网关7、补充&#xff1a;关于SDK的开发 关键点&#xff1a; 接口抽象类&#xff08;半抽象半实现&#xff09;具体实现类业务网关反射加载SDK&#…

电脑出现这些现象,说明你的固态硬盘要坏了

与传统机械硬盘&#xff08;HDD&#xff09;相比&#xff0c;固态硬盘&#xff08;SSD&#xff09;速度更快、更稳定、功耗更低。但固态硬盘并不是完美无瑕的&#xff0c;由于颗粒写入机制&#xff0c;可能会在七到十年的预期寿命之前出现故障。所以用户最好为最终故障做好准备…

网页设计中增强现实的兴起

目录 了解增强现实 增强现实的历史背景 AR 和网页设计的交叉点 AR 在网页设计中的优势 增强参与度和互动性 个性化的用户体验 竞争优势和品牌差异化 AR 在网页设计中的用例 结论 近年来&#xff0c;增强现实已成为一股变革力量&#xff0c;重塑了我们与数字领域互动的方式。它被…

【FMCW毫米波雷达设计 】 — FMCW波形

原书&#xff1a;FMCW Radar Design 1 引言 本章研究驱动FMCW雷达的主要波形:线性调频(LFM)波形。我们研究信号的行为及其性质。随后&#xff0c;本章讨论了匹配滤波理论&#xff0c;并研究了压缩这种波形的技术&#xff0c;特别是所谓的拉伸处理&#xff0c;它赋予FMCW雷达极…

DOS 批处理 (二)

DOS 批处理 1. 基础 DOS 命令1.1 基础命令1.2 文件系统操作1.3 文件夹管理1.4 文件管理1.5 网络相关1.6 系统管理1.7 IF、FOR和NETIFFORNET 1. 基础 DOS 命令 command /? 查找帮助DOS命令不区分命令字母的大小写 C:\Users\Administrator>echo 1 1 C:\Users\Administrator…

基于SSM框架的仓库管理系统

基于SSM框架的仓库管理系统 文章目录 基于SSM框架的仓库管理系统 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 现代商业环境中&#xff0c;仓库管理对于企业的运营效率和客户满意度至关重要。传统的手工管理方式已经无法满足日益复杂的仓储需求。…

【Spring】SpringBoot日志

SpringBoot日志 日志概述日志使用打印日志获取日志对象使用日志对象打印日志日志框架介绍门面模式SLF4J框架介绍(simple logging facade for java) 日志格式说明日志级别日志级别的分类日志级别的使用 日志配置配置日志级别日志持久化配置日志文件的路径和文件名配置日志文件的…