【C++11】auto与decltype关键字使用详解
系列文章目录
C++11新特性使用详解-持续更新
文章目录
- 系列文章目录
- 前言
- 一、auto关键字
- 1.根据变量的初始化表达式来推导变量的类型
- 2.const与引用
- 二、decltype关键字
- 1.推断表达式的类型
- 2.const与引用
- 三、总结
前言
auto和decltype是C++11引入的俩个重要的新关键字,用于在编译期自动推导出变量或表达式的类型。极大提高代码的可读性和简洁性,并且有助于减少类型转换错误。
一、auto关键字
编程时常常需要把表达式的值赋给变量,这就要求变量申明时必须清楚知道表达式的类型。做到这点不容易或者根本做不到。为了解决这个问题,C++11引入auto关键字让编译器自动推导变量的类型。
1.根据变量的初始化表达式来推导变量的类型
auto a = 1; // a的类型为int
auto b = 5.20; // b的类型为double
auto c = "auto"; // c的类型为const char[6]
auto person1 = Person(); // person1的类型为Person,并且自动初始化成员变量变量
auto person2 = Person{ "Fei", 30 }; // person2的类型为Person,并且根据指定的初始值初始化成员变量变量std::vector<int> vec = { 1, 2, 3, 4, 5 };
for (auto it = vec.begin(); it != vec.end(); ++it) { // 在for循环中使用auto推导类型std::cout << *it << " ";
}
2.const与引用
使用引用其实是使用引用的对象。特别是当引用被当作初始值时,正在参与初始化的是引用对象的值。此时编译器以引用对象的类型作为auto的类型。
int i = 10, &r = i;
auto aa = r; //推导出aa类型是int:r是i的别名,i是int(正在参与初始化的是引用对象的值,以引用对象的值作为auto的类型)//auto一般会忽略顶层const,同时底层const则会被保留
const int ci = i, &cr = ci;
auto bb = ci; //推导出bb类型是int(ci的顶层const特性被忽略了)
auto cc = cr; //推导出cc类型是int(cr是ci的别名,ci本身是一个顶层const)
auto dd = &i; //推导出cc类型是int*
auto ee = &ci; //推导出cc类型是const int*(对常量对象取地址是一种底层const)//如果希望auto推断出来的类型是一个顶层的const,需要明确指出
const auto ff = ci; //推导出b类型是int//设置类型为auto的引用是,初始值中的顶层常量属性任然保留
auto &gg = ci; //推导出b类型是const int&
二、decltype关键字
希望从表达式的类型中推导除要定义的变量的类型,但是不想用该表达式的值初始化变量。为了满足这各要求,C++11引入decltype关键字让编译器自动推导表达式的类型,而不用计算表达式的值。
1.推断表达式的类型
int x = 10;
decltype(x) y; //y的类型是intdouble foo();
decltype(foo()) z; //z的类型是double,根据函数返回值类型推导
2.const与引用
decltype处理顶层const和引用的方法和auto不同。
如果表达式是一个引用类型,decltype会去除引用,推导出引用所引用的类型。
例如,对于表达式int& x, decltype(x)的推导结果是int,去除了引用。
需要注意的是,decltype推导出的类型会保留顶层const限定符和volatile限定符,不会去除它们。
const int cii = 10, &cjj = cii;
decltype(cjj) xx = 0; //x的类型是const int&
decltype(cjj) yy = xx; //x的类型是const int&,y绑定到x
//decltype(cjj) zz; //错误: z是个引用,必须初始化int xxx = 0;
decltype(xxx) pp = 0;
三、总结
在不影响代码可读性的前提下可以尽可能的使用auto。复杂类型用auto,但是简单内置类型就没有必要使用auto了。总之避免过度使用auto和decltype,以保持代码的可读性和维护性。
相关文章:
【C++11】auto与decltype关键字使用详解
系列文章目录 C11新特性使用详解-持续更新 文章目录 系列文章目录前言一、auto关键字1.根据变量的初始化表达式来推导变量的类型2.const与引用 二、decltype关键字1.推断表达式的类型2.const与引用 三、总结 前言 auto和decltype是C11引入的俩个重要的新关键字,用…...
Servlet实现一个简单的表白墙网站
文章目录 前言效果展示事前准备HTML、CSS、JavaScript分别负责哪些HTML和CSS构架出页面的基本结构和样式JavaScript 实现行为和交互实现服务器端的业务代码整理pom.xmlweb.xmlmessageWall.htmlMessageServlet.java 前言 前面我们学习了 Java 中知名的 HTTP 服务器 tomcat 的安…...
mysql 集群恢复
准备使用集群的时候发现集群起不来, 发现抱错集群各个节点都是readonly 状态,找了很多资料,由于集群处于不一致的情况需要防止不同的节点数据写入脏数据 取消节点readonly 方法如下: MySQL 取消 super read only 直接关闭read…...
基于STM32的色彩识别与分类算法优化
基于STM32的色彩识别与分类算法优化是一项与图像处理和机器学习相关的研究任务,旨在实现高效的色彩识别和分类算法在STM32微控制器上的运行。本文将介绍基于STM32的色彩识别与分类算法优化的原理和实现步骤,并提供相应的代码示例。 1. 色彩识别与分类概…...
阿里云发送短信
官方代码如下: // This file is auto-generated, dont edit it. Thanks. package com.aliyun.sample;import com.aliyun.tea.*;public class Sample {/*** 使用AK&SK初始化账号Client* param accessKeyId* param accessKeySecret* return Client* throws Excep…...
关于用css设置input输入框hover的时候的样式以及当input为disabled的时候,不要让hover样式生效
效果如果: 编辑状态下的时候: 只读状态下的时候: 代码如图: <input type"text" name"dataForm.exportCode" id"exportCodeItem" required :disabled"editDisabled" />input:not(…...
hadoop在本地创建文件,然后将文件拷贝/上传到HDFS
1.要$cd {对应目录}进入到对应目录,一般为 cd /usr/local/hadoop/ 2.创建文件,$sudo gedit {文件名},例 sudo gedit test.txt 然后在弹出的txt文件输入内容,点击右上角的保存之后,关闭即可。 3.拷贝本地文件到HDF…...
NFC:应用场景广泛的短距离通信技术
NFC:应用场景广泛的短距离通信技术 一、NFC 技术介绍1.1 NFC 技术应用场景1.2 NFC 技术优点1.3 NFC 工作原理 二、NFC 开发2.1 NFC 应用开发流程2.2 NFC 读取和写入2.3 NFC 读写功能示例 三、总结 一、NFC 技术介绍 NFC (Near-field communication&…...
CentOS使用docker安装OpenGauss数据库
1.搜索OpenGauss docker search opengauss 2.选择其中一个源拉取 docker pull docker.io/enmotech/opengauss 3.运行OpenGauss docker run --name opengauss --privilegedtrue --restartalways -d -e GS_USERNAMEpostgres -e GS_PASSWORDmyGauss2023 -p 5432:5432 docker.…...
原理Redis-QuickList
QuickList **问题1:**ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办? 为了缓解这个问题,我们必须限制ZipList的长度和entry大小。 **问题2:**但是…...
js双击修改元素内容并提交到后端封装实现
前面发过一个版本了,后来又追加了些功能。重新发一版。新版支持select和radio。 效果图: 右上角带有绿标的,是可以修改的单元格。如果不喜欢显示绿标,可以传递参数时指定不显示,如果想改为其它颜色,也可以…...
Kubernetes+Gitlab+Jenkins+ArgoCD多集群部署
KubernetesGitlabJenkinsArgoCD多集群部署 文章目录 KubernetesGitlabJenkinsArgoCD多集群部署1. KubernetesGitlabJenkinsArgoCD多集群部署2. 添加WebHooks自动触发3. Jenkins-构建-执行Shell4. 制作镜像及修改Yaml文件4.1 Dockerfile4.2 Build-Shell 5.自动部署Demo测试5.1 推…...
在中国企业出海的大浪潮下,亚马逊云科技提供遍及全球的基础设施和技术支持
中国技术出海是中国企业更高层次更高质量的全球化。在人类文明发展史上,凝聚中国古人智慧结晶的造纸术、印刷术、火药、指南针等,曾为中国技术出海写下过浓墨重彩的一笔。在今天,如金山办公、店匠科技、ADVANCE.AI等公司又以技术立业…...
前端如何判空
这样判空就会报错 loadNode(node, resolve)console.log("node")console.log(node)if (node.data ! null) {this.get(ctx /publicity/publicityType/typeTreeData?id node.data.id).then((res) > {resolve(res)})}}, 需要这样写,用typeof来做类型判…...
基于SSM的焦作旅游协会管理系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
庖丁解牛:NIO核心概念与机制详解 07 _ 字符集
文章目录 Pre概述编码/解码处理文本的正确方式示例程序Code Pre 庖丁解牛:NIO核心概念与机制详解 01 庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现 庖丁解牛:NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片 庖丁解牛&…...
ansible的基本安装
目录 一、简介 1.ansible自动化运维人工运维时代 2.自动化运维时代 3.ansible介绍 4.ansible特点 二、ansible实践 1.环境 2.ansible管理安装 3.ansible被管理安装 4.管理方式 5.添加被管理机器的ip 6.ssh密码认证方式管理 三、配置免密登录 1.ansible自带的密码…...
开发仿抖音APP遇到的问题和解决方案
uni-app如何引入阿里矢量库图标/uniapp 中引入 iconfont 文件报错文件查找失败 uni-app如何引入阿里矢量库图标 - 知乎 uniapp 中引入 iconfont 文件报错文件查找失败:‘./iconfont.woff?t1673007495384‘ at App.vue:6_宝马金鞍901的博客-CSDN博客 将课件中的cs…...
手机上玩.NET的两种方式
少见!手机上玩 .NET_哔哩哔哩_bilibili 小米平板敲代码,termux安装dotnet和vscode_哔哩哔哩_bilibili 都是先容器加载linux rootfs,然后安装 linux-arm64 版本的 dotnet 命令行方式运行 dotnet,代码编辑到是可以安装使用 vscode…...
DedeBIZ 管理系统 DedeV6 v6.2.6 社区版 免费授权版
DedeBIZ 系统:开源、安全、高效的 DedeV6 v6.2.6 社区版 DedeBIZ 系统是基于 PHP 7 版本开发的,具有强大的可扩展性,并且完全开放源代码。它采用现流行的 Go 语言设计开发,不仅拥有简单易用、灵活扩展的特性,还具备更…...
终极指南:5分钟掌握Anno 1800模组加载器,打造你的专属游戏世界
终极指南:5分钟掌握Anno 1800模组加载器,打造你的专属游戏世界 【免费下载链接】anno1800-mod-loader The one and only mod loader for Anno 1800, supports loading of unpacked RDA files, XML merging and Python mods. 项目地址: https://gitcode…...
如何快速掌握Kemono批量下载工具:WinUI3开发的终极指南
如何快速掌握Kemono批量下载工具:WinUI3开发的终极指南 【免费下载链接】Kemono-Downloader-GUI Kemono Downloader with WinUI3 | Kemono下载器,使用WinUI3构建 项目地址: https://gitcode.com/gh_mirrors/ke/Kemono-Downloader-GUI 你是否厌倦了…...
用VOFA+可视化调PID速度环,告别盲调!手把手教你从串口数据到实时波形
用VOFA实现PID速度环可视化调参:从数据采集到参数优化的完整指南 调试嵌入式系统中的PID控制器时,最令人头疼的莫过于反复修改参数、下载程序、观察日志的循环。传统调试方式就像在黑暗中摸索,而VOFA的出现为工程师们点亮了一盏明灯。本文将…...
轻量级内存管理工具Mem Reduct:为什么它能在众多优化软件中脱颖而出?
轻量级内存管理工具Mem Reduct:为什么它能在众多优化软件中脱颖而出? 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mir…...
从Whetstone.ChatGPT到官方SDK:.NET集成OpenAI API的演进与迁移实践
1. 项目概述:一个已归档的 .NET ChatGPT 客户端库如果你是一个 .NET 开发者,想在 C# 项目里快速集成 OpenAI 的 ChatGPT、GPT-4、Whisper 等 AI 能力,那你很可能在某个时间点搜索到过一个叫Whetstone.ChatGPT的库。这个库在 2023 年曾因被 Vi…...
重塑本地观影体验:BiliLocal开源弹幕播放器深度探索
重塑本地观影体验:BiliLocal开源弹幕播放器深度探索 【免费下载链接】BiliLocal add danmaku to local videos 项目地址: https://gitcode.com/gh_mirrors/bi/BiliLocal 在离线观影时,你是否曾想念那些飘过的弹幕带来的互动乐趣?BiliL…...
保姆级教程:在Windows 11的Docker Desktop上部署Netdata监控(含汉化与WSL2配置)
Windows 11环境下Docker Desktop部署Netdata全流程指南 对于习惯Windows环境的开发者来说,想要实时监控本地开发环境的资源使用情况往往需要借助第三方工具。Netdata作为一款开源的实时监控工具,以其轻量级和丰富的可视化功能受到开发者青睐。本文将详细…...
告别驱动兼容性噩梦:手把手解决华为ATLAS300I在Ubuntu20.04上的内核报错问题
华为ATLAS300I在Ubuntu20.04上的内核兼容性攻坚实录 当AI加速卡遇上新系统内核,技术人最熟悉的"dependency hell"场景又一次上演。上周团队收到一台搭载华为ATLAS300I model3010的测试机,官方文档明确标注支持Ubuntu20.04,但实际部…...
Laravel AI智能体框架设计:从第三方包到官方SDK的迁移实践
1. 项目概述与核心价值如果你是一名Laravel开发者,最近正在琢磨怎么把AI能力,比如让ChatGPT或者Claude帮你发短信、查天气、做计算,优雅地集成到自己的应用里,那你可能已经踩过一些坑了。直接调用API写一堆胶水代码,处…...
WPS-Zotero:3步实现Linux与Windows无缝文献管理
WPS-Zotero:3步实现Linux与Windows无缝文献管理 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero 还在为跨平台学术写作而烦恼吗?WPS-Zotero插件为你提…...
