类型别名与类型自动推导
类型别名与类型的自动推导
类型别名
为什么要引入类型别名?
为了给类型赋予特殊含义或便于使用
典型用途
(1)增强代码可移植性
例如:size_t (在不同系统中可能是unsigned int 或 unsigned long)
首先是无符号整型,可以表示任意尺寸的对象,通过别名来实现的
(2)简化复杂类型声明(如数组类型char[4])
实际意义
类型别名不是新类型,编译器会将其替换为原始类型处理。
引入类型别名的两种方式
传统方式 (typedef)
typedef 原类型 新类型名
typedef char MyCharArr[4]
缺点:对于复杂类型声明不直观,需要将新类型名插入原类型中间,本来是char[4],现在 char MyCharArr[4],char[4]中间插入了别名
现代方式(using)
using 新类型名 = 原类型
using MyCharArr = char[4]
优势:
声明形式更符合直觉(从左到右阅读)
特别适合模板别名
建议:C++11后优先使用using
类型别名与指针、引用的关系
应将指针类型别名视为一个整体,在此基础上引入常量表示指针为常量的类型
using IntPtr = int*;
int main(){int x = 3;const IntPtr ptr = &x; //const修饰整个IntPtr,即const修饰int*int y = 0;ptr = &y; //报错,ptr是常量指针,无法修改其指向
}
对于指针和引用来说,类型别名不是简单的替换
using IntPtr = int*;
//const修饰整个int*
const IntPtr ptr = &x; //指针的指向无法被修改
//上下不相同
//const修饰int
const int* ptr = &x;//所指向的值不能够被更改
不能通过类型别名构造引用的引用
using RefInt = int&; //引用的类型别名
using RefRefInt = RefInt&; //引用的引用,无效
#include<iostream>
#include<type_traits>
using RefInt = int&;
using RefRefInt = RefInt&;
int main(){
std::cout << is_same_v<int&, RefRefInt> << std::endl;
//结果为1,代表类型相同
}
类型自动推导
– 从 C++11 开始,可以通过初始化表达式自动推导对象类型
– 自动推导类型并不意味着弱化类型,对象还是强类型
强类型:任何变量的类型在生存周期(即从定义到销毁)其类型不会被改变
//浮点型+长整型得到什么类型?
什么类型? x = 3.5 + 15l;
//让编译器自己推导
auto x = 3.5 + 15l;
auto x; //错误
auto x{3}; //正确
auto x = 一个表达式; //正确
左值、右值
什么是左值、右值?
左值(lvalue,location value)是指在程序中有明确存储位置的对象,它们通常是具名变量,或者能被引用的对象。
1.左值可以出现在赋值语句的左侧,也可以出现在右侧。
2.有持久的存储位置:左值是具有稳定存储位置的对象,程序在其作用域内始终可以通过内存地址访问它。
可修改:通常左值是可修改的,但若被声明为 const,则不允许修改
int x = 10; // x 是左值,因为它有明确的存储位置
x = 20; // 可以修改 x 的值
int &ref = x; // 左值引用可以绑定到左值 x
右值(rvalue,read value)是指没有明确存储位置的临时对象,通常是字面量、表达式计算的结果,或需要被销毁的临时对象
1.右值一般只能出现在赋值语句的右侧,不能被赋值。
2.临时对象:右值通常是表达式计算的临时结果,无法通过地址来引用。
不可修改:右值通常不具备可修改性,特别是在表达式中,编译器会在表达式结束后销毁它。
int x = 10;
int y = x + 5; // x + 5 是右值,表达式结果为临时值
int z = 20; // 20 是右值常量
左值和右值的实际用途
(1)左值用于持久性对象:在程序中需要长期使用、反复访问的数据应该作为左值。例如,变量和对象都是左值。
(2)右值用于临时数据:如果一个数据只在短期内使用一次或立即处理完就可以销毁,适合使用右值。字面量、表达式结果通常就是右值。
自动推导的几种常见形式
● auto: 最常用的形式,但会产生类型退化
int x1 = 3;
int& ref = x1; //这里ref为左值
auto ref2 = ref; //这里的ref为右值,ref从int&退化为了int
int x[3] = {1,2,3};
auto x1 = x; //x退化为int*
int x[3] = {1,2,3};
auto& x1 = x; //x1类型为int(&)[3]
● const auto / constexpr auto: 推导出的是常量 / 常量表达式类型
const auto x = 3; //x类型为const int
constexpr auto x = 4; //x类型为const int,constexpr不是类型,只是修饰符表示在编译期间就确定为了常量
//-------------
const int x = 3;
const auto y = x; //这里不会产生类型退化,x仍为const int
//-------------
const int x = 3;
auto y = x; //这里x类型由const int 退化为 int
● auto& : 推导出引用类型,避免类型退化
const auto& x = 3; //x类型为const int&
//---------------
const int x = 3;
auto& y = x; //x没有发生类型退化,y的类型为const int&
decltype(这种类型自动推导不会产生退化)
● decltype(exp) :返回 exp 表达式的类型
如果是左值,则decltype会自动加引用(左值加引用)
int x = 3;
//decltype(x) x为左值但推导为int
int* ptr = &x; //ptr类型为int*
//*ptr为解引用,类型为int
//decltype(*ptr)为int自动加引用,int&
● decltype(val) :返回 val 的类型
int x = 3;
int& y1 = x;
auto y2 = y1; //y1类型由int&退化为int
decltype(y1) y3 = y1; //y3的类型为int&
decltype(exp) 、decltype(val) 的例子
int x = 3;
int* ptr = &x;
//decltype(*ptr)为int&
//decltype(ptr)为int*
//decltype(x)为int
//decltype((x))为int&,(x)为左值且是表达式
const int y1 = 3;
const int& y2 = y1;
//decltype(y1)为const int
//decltype(y2)为const int&
//decltype((y1))为const int&
//decltype((y2))为const int&
● decltype(auto) :从 c++14 开始支持,简化 decltype 使用
decltype(3.5 + 15l) x = 3.5 + 15l;
decltype(auto) x =3.5 + 15l;
● concept auto :从 C++20 开始支持,表示一系列类型( std::integral auto x = 3;)
限制类型推导的范围
#include<concept>
std::integral auto y = 3; //
C++20 引入的 Concepts 是模板编程的革命性特性,其核心作用是为模板参数提供编译时类型约束,显著提升代码的健壮性和可读性。
template<std::integral T> // 约束 T 必须是整数类型
T square(T value) { return value * value; }
若传入 float,编译器会直接报错:“约束 std::integral 未满足”,而非冗长的模板实例化错误
相关文章:
类型别名与类型自动推导
类型别名与类型的自动推导 类型别名 为什么要引入类型别名? 为了给类型赋予特殊含义或便于使用 典型用途 (1)增强代码可移植性 例如:size_t (在不同系统中可能是unsigned int 或 unsigned long) 首先是…...

一站式直播工具:助力内容创作者高效开启直播新时代
近年来,随着互联网技术的不断进步和短视频、直播行业的爆发式增长,越来越多的企业和个人投入到直播电商、互动娱乐、在线教育等场景。直播运营过程中,涉及到数据统计、弹幕互动、流程自动化、内容同步等诸多环节。如何提升运营效率、减少人工…...
【学习笔记】Lamba表达式[匿名函数]
【学习笔记】Lamba表达式[匿名函数] Lamba表达式格式函数模板Lamba表达式例子 Lamba表达式格式 格式: [捕获列表](参数列表) -> 返回类型 { 函数体 }1、捕获列表:指定如何访问外部变量(如 [&x] 引用捕获,[x] 值捕获&#…...
学习笔记(26):线性代数-张量的降维求和,简单示例
学习笔记(26):线性代数-张量的降维求和,简单示例 1.先理解 “轴(Axis)” 的含义 张量的 “轴” 可以理解为 维度的方向索引 。对于形状为 (2, 3, 4) 的张量,3 个轴的含义是: 轴 0(axis0&…...

以智能管理为基础,楼宇自控打造建筑碳中和新路径
在全球气候变化的严峻形势下,“碳中和”已成为各国发展的重要战略目标。建筑行业作为能源消耗与碳排放的“大户”,其运行阶段的能耗占全社会总能耗近40%,碳排放占比与之相当,实现建筑碳中和迫在眉睫。传统建筑管理模式下ÿ…...
81 实战一:给root目录扩容
添加一块100G硬盘 vgextend centos /dev/sdb1 /dev/sdc lvextend -L +120G /dev/centos/root xfs_growfs /dev/centos/root df -h 看是否扩容成功 82 实战二:给swap空间扩容 添加一块20G硬盘 fdisk -l 可以看到新添加的硬盘 vgextend centos /dev/sdd …...
1130 - Host ‘xxx.x.xx.xxx‘is not allowed to connect to this MySQL server
以下为本次问题的解决办法: 1、暂停mysql容器: docker stop mysql 2、删除mysql容器:docker rm mysql 3、查看mysql容器是否被删除:docker ps -a #没有mysql容器就是删除成功 4、run mysql容器: docker run -d --…...
HttpURLConnection实现
我有一个接口 http://ip:port/Others/airportnew/,采用post方法调用,采用body方式传值,其body内容为{"data": {"data": {"image": ""}} },现在我需要在java中调用这个接口,帮…...

day029-Shell自动化编程-计算与while循环
文章目录 1. read 交互式初始化变量1.1 案例-安装不同的软件1.2 案例-比较大小 2. 计算2.1 bc2.2 awk2.3 expr2.4 let2.5 案例-计算内存的空闲率2.6 案例-检查域名过期时间和https整数过期时间 3. 循环3.1 循环控制语句3.2 for循环-c语言格式3.3 while循环3.3.1 案例-猜数字3.3…...

Linux命令基础(2)
su和exit命令 可以通过su命令切换到root账户 语法:su [-] 用户名 -符号是可选的,表示是否在切换用户后加载环境变量,建议带上 参数:用户名,表示要切换的用户,用户名可以省略,省略表示切换到ro…...

vue3 + vite实现动态路由,并进行vuex持久化设计
在后台管理系统中,如何根据后端返回的接口,来动态的设计路由呢,今天一片文章带你们解 1、在vuex中设置一个方法 拿到完整的路由数据 const state {routerList: []}; const mutations { dynameicMenu(state, payload) {// 第一步 通过glob…...
ThingsCloud事物云平台搭建-微信小程序
ThingsCloud云平台与微信小程序设计 本文主要是介绍ThingsCloud云平台的搭建及微信小程序与app的使用。 当前文章是作为一个通用案例,介绍如何快速使用 ThingsCloud云平台 以及 利用 ThingsCloud云平台平台的框架快速设计手机APP和微信小程序。 可以快速让硬件接入,实现硬件…...
为什么 uni-app 开发的 App 没有明显出现屏幕适配问题Flutter 开发的 App 出现了屏幕适配问题
🧩 一、为什么 uni-app 开发的 App 没有明显出现屏幕适配问题? ✅ 1. uni-app 是基于 H5 的运行环境(或类 H5) uni-app 默认使用的是 H5 的渲染引擎(如 WebView 或小程序渲染引擎)。在 H5 中,…...

学习路之php--性能优化
一、php周边优化 二、代码级优化 变量管理 及时unset()释放大数组/对象,减少内存占用局部变量访问速度比全局变量快约2倍,优先使用局部变量大数组采用引用传递(&$var)避免内存 循环优化 预计算循环次数: …...

GC1808:高性能24位立体声音频ADC芯片解析
1. 芯片简介 GC1808 是一款24位立体声音频模数转换器(ADC),支持96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于家庭影院、蓝牙音箱等场景。 核心特性 高精度:24位分辨率,…...

echarts使用graph、lines实现拓扑,可以拖动增加effect效果
options.js // import React from react // import * as echarts from echartsimport ./index.lessexport const useEchartsOptionFun ({ nodeDataList, getNodeLinksDataList, getLinesCoordsFun }) > {const option {title: {text: 拓扑关系图,top: top,left: center,}…...

产品经理课程(九)
从需求到功能设计 (一)复习 产品规划:产品定位、阶段性计划 产品定位:产品画布(9个步骤;最重要的是先解决什么问题) (Roadmap)目标要素:时间、事项、里程碑…...
二.单例模式
一.单例模式的定义 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供该实例的全局访问点。 1.1.核心目标 唯一实例:限制类的实例化次数仅一次。全局访问:提供统一的访问入口(通常是静…...

从零开始开发纯血鸿蒙应用之网络检测
从零开始开发纯血鸿蒙应用 〇、前言一、认识 connection 模块1、获取默认网络2、获取网络能力信息3、解析网络能力信息3.1、NetCap3.2、NetBearType 二、实现网络检测功能1、申请权限2、获取默认网路的 NetCap 数组 三、总结 〇、前言 在之前的博文里,介绍了如何实…...

向 AI Search 迈进,腾讯云 ES 自研 v-pack 向量增强插件揭秘
作者:来自腾讯云刘忠奇 2025 年 1 月,腾讯云 ES 团队上线了 Elasticsearch 8.16.1 AI 搜索增强版,此发布版本重点提升了向量搜索、混合搜索的能力,为 RAG 类的 AI Search 场景保驾护航。除了紧跟 ES 官方在向量搜索上的大幅优化动…...
接IT方案编写(PPT/WORD)、业务架构设计、投标任务
1、IT 方案编写(PPT/WORD) 定制化方案:根据客户需求,提供涵盖云计算、大数据、人工智能等前沿技术领域的 PPT/WORD 方案编写服务,精准提炼核心价值,呈现专业技术内容。 逻辑清晰架构:采用…...
PostgreSQL 的扩展pageinspect
PostgreSQL 的扩展pageinspect pageinspect 是 PostgreSQL 提供的一个强大的底层扩展,允许数据库管理员和开发者直接检查数据库页面的内部结构。这个扩展对于数据库调试、性能优化和深入学习 PostgreSQL 存储机制非常有价值。 一、扩展概述 功能:提供…...
Unity——QFramework框架 内置工具
QFramework 除了提供了一套架构之外,QFramework 还提供了可以脱离架构使用的工具 TypeEventSystem、EasyEvent、BindableProperty、IOCContainer。 这些工具并不是有意提供,而是 QFramework 的架构在设计之初是通过这几个工具组合使用而成的。 内置工具…...

【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作
在主机A pycharm如何连接远程主机B win docker? 需要win docker配置什么? 快捷配置-主机B win OpenSSH SSH Server https://blog.csdn.net/z164470/article/details/121683333 winR,打开命令行,输入net start sshd,启动SSH。 或者右击我的电脑&#…...

股指期货波动一个点多少钱?
很多朋友在交易股指期货时,都会好奇一个问题:股指期货波动一个点,我的账户里到底是赚了还是亏了多少钱?要搞清楚这个问题,其实很简单,只需要了解两个关键信息:股指期货的“交易单位”࿰…...
Kafka 快速上手:安装部署与 HelloWorld 实践(一)
一、Kafka 是什么?为什么要学? ** 在大数据和分布式系统的领域中,Kafka 是一个如雷贯耳的名字。Kafka 是一种分布式的、基于发布 / 订阅的消息系统,由 LinkedIn 公司开发,后成为 Apache 基金会的顶级开源项目 。它以…...
NGINX `ngx_stream_core_module` 模块概览
一、模块定位与功能 通用 TCP/UDP 代理 支持同时处理 TCP 和 UDP 流量,透明转发请求到后端服务器组(upstream)。可作为四层负载均衡,根据客户端 IP、权重、最少连接等策略将连接分发给后端。 预读(preread)…...

iOS、Android、鸿蒙、Web、桌面 多端开发框架Kotlin Multiplatform
Kotlin Multiplatform(简称 KMP)是 JetBrains 推出的开源跨平台开发框架 Kuikly 是腾讯开源的跨端开发框架,基于 Kotlin Multiplatform 技术构建,为开发者提供了技术栈更统一的跨端开发体验 KMP 不仅局限于移动端,它…...

探索C++标准模板库(STL):String接口的底层实现(下篇)
前引:在C的面向对象编程中,对象模型是理解语言行为的核心。无论是类的成员函数如何访问数据,还是资源管理如何自动化,其底层机制均围绕两个关键概念展开:this指针与六大默认成员函数。它们如同对象的“隐形守护者”&am…...

Flutter知识点汇总
Flutter架构解析 1. Flutter 是什么?它与其他移动开发框架有什么不同? Flutter 是 Google 开发的开源移动应用开发框架,可用于快速构建高性能、高保真的移动应用(iOS 和 Android),也支持 Web、桌面和嵌入式设备。。它与其他移动开发框架(如 React Native、Xamarin、原…...