当前位置: 首页 > article >正文

转向现代C++——优先选用限定作用域的枚举型别,而非不限作用域的枚举型别

文章目录优先选用限定作用域的枚举型别而非不限作用域的枚举型别名字空间污染强类型安全与隐式转换前置声明特例什么时候不限作用域的 enum 更好现代 C 的替代方案C17 结构化绑定优先选用限定作用域的枚举型别而非不限作用域的枚举型别在 C98 中我们使用的 enum 是不限作用域的unscoped enum而 C11 引入了通过 enum class 声明的限定作用域的枚举scoped enum。绝大多数情况下选择 enum class。它能帮你屏蔽掉大量由于隐式类型转换和命名冲突导致的低级 Bug。名字空间污染不限作用域的枚举enum中定义的名字会直接泄漏到该枚举所在的作用域中。这意味着你不能在同一个作用域内定义同名的枚举常量。enumColor{black,white,red};// 编译错误black 已经在这个作用域被定义过了// enum class Astronomy { black, white, red };autowhitefalse;// 编译错误white 已被用作枚举常量enum class 的名字只在枚举内部可见必须通过作用域解析运算符::来访问解决了命名冲突。enumclassColor{black,white,red};enumclassLight{google,white,baidu};// white 不会冲突Color cColor::black;// 必须加上 Color::Light lLight::white;// 必须加上 Light::autowhitefalse;//此时的 white 是一个独立的变量强类型安全与隐式转换不限作用域的枚举会极其隐式地转换为整型甚至浮点型这经常导致不合逻辑的代码能够通过编译。而 enum class 是强类型的绝不隐式转换。enumColor{black,white,red};Color cred;// 荒谬的比较颜色竟然可以和数字、浮点数直接比大小if(c14.5){// 编译通过red 被隐式转换成了整数 2autoxc*10;// 编译通过允许算术运算}enumclassColor{black,white,red};Color cColor::red;// if (c 14.5) { } // 编译错误不能将 Color 与 double 进行比较// if (c 2) { } // 编译错误不能将 Color 与 int 进行比较// 如果真的需要转换必须进行显式类型转换static_castif(static_castint(c)2){// 显式转换安全且意图明确}前置声明在 C 中能够前置声明一个类型可以减少头文件包含从而加快编译速度。:::info传统 enum通常不能前置声明。因为编译器需要知道枚举的最大值以此来决定底层用多大的整数类型char、int 还是 short来存储它。::::::successenum class天生支持前置声明。因为它的默认底层类型underlying type是固定的标准规定默认为 int。:::// 头文件 Widget.h enum class Status; // 完美支持前置声明不需要知道具体有哪些枚举值 class Widget { Status s; // 编译器知道 Status 默认是 int 大小4字节可以确定 Widget 大小 }; // 实现文件 Widget.cpp enum class Status { Good, Failed, Unknown }; // 在这里才给出具体定义:::color4**补充说明C11 也允许传统的 enum 进行前置声明但你必须显式指定底层类型**如 enum Color: uint8_t;。而enum class 不需要显式指定默认就是 int。:::特例什么时候不限作用域的 enum 更好**当我们需要使用std::tuple并通过语义化的名字去获取里面的元素时传统 ****enum的隐式转换反而成了一种“便利”。**#includetuple#includestringusingUserInfostd::tuplestd::string,// 姓名std::string,// 邮箱std::size_t;// 声望值// 使用传统的 unscoped enumenumUserFields{uName,uEmail,uRep};voidprocessUser(){UserInfou(Alice,aliceemail.com,99);// 隐式转换为了 std::size_t语法非常自然autonamestd::getuName(u);}enumclassUserFields{uName,uEmail,uRep};voidprocessUser(){UserInfou(Alice,aliceemail.com,99);// 极其恶心、冗长的语法必须 static_castautonamestd::getstatic_caststd::size_t(UserFields::uName)(u);}现代 C 的替代方案C17 结构化绑定在现代 CC17 及以后中即使是上述特例我们也不再依赖传统 enum 了因为我们有了结构化绑定它比上面两种方法都更优雅voidprocessUser(){UserInfou(Alice,aliceemail.com,99);// 直接解包连枚举都不需要定义了auto[name,email,rep]u;}

相关文章:

转向现代C++——优先选用限定作用域的枚举型别,而非不限作用域的枚举型别

文章目录优先选用限定作用域的枚举型别,而非不限作用域的枚举型别名字空间污染强类型安全与隐式转换前置声明特例:什么时候不限作用域的 enum 更好?现代 C 的替代方案(C17 结构化绑定)优先选用限定作用域的枚举型别&am…...

如何快速获取免费的EB Garamond 12字体:古典优雅的终极排版解决方案

如何快速获取免费的EB Garamond 12字体:古典优雅的终极排版解决方案 【免费下载链接】EBGaramond12 项目地址: https://gitcode.com/gh_mirrors/eb/EBGaramond12 EB Garamond 12是一款完全免费的开源字体,完美复刻了16世纪Claude Garamont的经典…...

数据中心电力模块的发展趋势对数据中心建设的影响

在人工智能与高性能计算浪潮的推动下,数据中心正加速向智算中心演进。作为算力基石的供配电系统,其形态与功能正经历深刻重塑。电力模块作为预制模块化数据中心的核心组成部分,其发展演进正从建设模式、技术架构、运营管理和生态构建等多个维…...

如何快速掌握LRC Maker:新手制作精准同步歌词的完整指南

如何快速掌握LRC Maker:新手制作精准同步歌词的完整指南 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 在数字音乐时代,你是否曾想为自己喜…...

3个高效方法解决抖音素材管理难题:从零散文件到有序素材库

3个高效方法解决抖音素材管理难题:从零散文件到有序素材库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…...

One API 部署教程(上):本地部署完整指南

前言 One API 是一个开源的 AI API 聚合管理平台,可以让你用一个统一的接口调用多个 AI 平台的 API(如 OpenAI、DeepSeek、通义千问等)。 为了让大家能全面了解 One API,我决定写一个系列教程: One API 部署教程(上):本地部署完整指南(本文) One API 部署教程(中)…...

如何用Path of Building物品制作系统打造终极装备:5个简单步骤

如何用Path of Building物品制作系统打造终极装备:5个简单步骤 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/gh_mirrors/pat/PathOfBuilding 你是否曾为《流放之路》中装备制作耗费大量通货却得…...

【NotebookLM因子分析实战指南】:3步解锁AI驱动的维度降维与业务洞察力

更多请点击: https://intelliparadigm.com 第一章:NotebookLM因子分析辅助的底层逻辑与价值定位 NotebookLM 是 Google 推出的面向研究者的 AI 助手,其核心能力并非泛化式问答,而是基于用户上传文档进行“可信引用驱动”的深度推…...

体验Taotoken分钟级接入与标准OpenAI协议的无缝切换

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 体验Taotoken分钟级接入与标准OpenAI协议的无缝切换 对于已经熟悉OpenAI API的开发者而言,尝试新的模型服务通常意味着…...

地平线旭日X3派边缘AI开发板深度体验:从开箱到模型部署实战

1. 项目概述:当“地平线”升起时,我们看到了什么?最近几年,如果你关注边缘计算、机器人或者智能驾驶,那么“地平线”这个名字你一定不陌生。它早已不是那个遥远的天际线,而是成为了国内AI芯片领域一个响当当…...

HS2-HF_Patch:一键解决《Honey Select 2》三大核心问题的终极增强补丁

HS2-HF_Patch:一键解决《Honey Select 2》三大核心问题的终极增强补丁 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 厌倦了《Honey Select 2》原版…...

观察Taotoken模型广场在项目初期技术选型中的辅助作用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察Taotoken模型广场在项目初期技术选型中的辅助作用 在启动一个涉及大模型能力的新项目时,技术选型往往是第一道门槛…...

从1秒到60ms:手把手教你用STM32硬件SPI驱动GC9A01 LCD,性能飙升实战

从1秒到60ms:STM32硬件SPI驱动GC9A01 LCD的性能优化实战 当你在嵌入式项目中遇到屏幕刷新缓慢的问题时,那种卡顿感简直让人抓狂。想象一下,你刚拿到一块1.28寸的GC9A01 LCD屏幕,满心欢喜地准备展示你的项目成果,却发现…...

Claude code配置全流程(附带接入模型)

1.安装nodejs (Claudecode 本身是用TypeScript/JavaScript开发的命令行工具,需要通过Node.js运行时来执行,并且node.js天然集成npm,claudecode是作为npm包发布的): 1.1网址:https://node.org.cn/ 进入后下载自己需要的系统类型就可…...

基于ESP32与EzDIO的离线人脸识别门锁DIY全攻略

1. 项目概述:从智能门锁到人脸识别,一个DIY玩家的实践最近几年,智能家居的概念越来越火,从手机控制灯光到语音助手开关窗帘,似乎万物皆可“智能”。作为一个喜欢折腾硬件的玩家,我总觉得市面上的成品智能门…...

【最新v2.7.5 版本安装包】保姆级一步到位,OpenClaw 零基础无需命令一键部署即能用

🚀 OpenClaw 一键安装包|一键部署甩掉复杂环境配置 【点击下方链接下载最新安装包】 https://xiake.yun/api/download/package/16?promoCodeIVBE1F235167 📌 适配信息 适配系统:Windows10/11 64 位 当前版本:…...

【最新v2.7.5 版本安装包】OpenClaw 2.7.5 保姆级教程,零基础无需命令一键部署不踩坑

🚀 OpenClaw 一键安装包|一键部署甩掉复杂环境配置 【点击下载最新安装包】https://xiake.yun/api/download/package/16?promoCodeIVBE1F235167 📌 适配信息 适配系统:Windows10/11 64 位 当前版本:v2.7.5&#xff…...

Perplexity估值从3B美元缩水至1.8B?华尔街分析师闭门会议纪要首度流出(含5条未公开预警红线)

更多请点击: https://intelliparadigm.com 第一章:Perplexity估值缩水事件全景速览 2024年第三季度,AI搜索初创公司Perplexity在完成新一轮融资后,其内部估值从2023年底的10亿美元迅速回调至约7.5亿美元,引发全球科技…...

Linux网络数据包处理全流程:从系统调用到网卡驱动的深度解析

1. 项目概述:从代码到比特流的旅程如果你在Linux上写过网络程序,无论是用C的send()还是Python的socket.sendall(),你可能都曾好奇过:我调用完这个函数之后,数据到底经历了什么才变成网线上的电信号?反过来&…...

【.NET新特性·第1篇】.NET 8:统一平台的成熟之作

三年磨一剑,.NET 8 是微软统一平台战略的首个 LTS 里程碑版本 版本定位 适用版本:.NET 8 | LTS(长期支持) 支持周期:3 年(2023.11 - 2026.11) 前置知识:.NET 6/7 或其他版本的 C# 开…...

Claude Code + Windows 桌面消息通知配置指南

Claude Code Windows 桌面通知配置指南 让 Claude Code 在完成任务后自动弹出 Windows 桌面通知,不用一直盯着屏幕等。 前置条件 Windows 10 或 Windows 11Claude Code CLI 已安装并能正常使用 安装步骤 第一步:创建通知脚本 创建目录 %USERPROFILE%\.cl…...

MRI绕组结构设计及均匀度优化算法【附算法】

✨ 长期致力于MRI、均匀度、球面谐波、目标场、主被动匀场、优化算法、超导磁体、线性规划、非线性规划研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1&#xff0…...

光学萌新看过来:用Lighttools 8.4.0配合Solidworks做光机设计,第一步安装和环境配置怎么做?

光学与机械协同设计:Lighttools 8.4.0与Solidworks环境配置全指南 在光机一体化设计领域,光学仿真软件与机械建模工具的协同工作已成为行业标配。对于刚接触光学设计的机械工程师,或是需要将光学分析融入机械设计流程的团队而言,掌…...

Perplexity实时新闻查询失效真相:Webhook劫持、缓存穿透与CDN时钟漂移三重陷阱

更多请点击: https://codechina.net 第一章:Perplexity实时新闻查询失效真相:Webhook劫持、缓存穿透与CDN时钟漂移三重陷阱 Perplexity 的实时新闻查询功能近期频繁返回陈旧或空结果,表面看是 API 延迟,实则深陷 Webh…...

STD算法实战:用Python从零复现激光SLAM中的“稳定三角形”回环检测(附代码)

STD算法实战:用Python从零复现激光SLAM中的“稳定三角形”回环检测 激光SLAM技术正在重新定义机器人导航的精度上限,而回环检测作为其核心模块,直接决定了建图与定位的长期稳定性。传统基于点云局部特征的方案在视角变化场景中表现欠佳&#…...

【JavaSE全面教学】Java集合框架下Day13(2026年)

写在前面:这是JavaSE系列的第13篇。上一篇讲了List家族,今天来讲Set和Map。HashMap是面试中问得最多的集合类,底层原理必须搞懂。建议收藏,反复看。 文章目录 一、Set集合:不可重复1.1 Set的特点1.2 HashSet1.3 Linked…...

Kubernetes核心知识点

1.ca-certificates,gnupg,lsb-release三个包的解释. ca-certificates是系统内置的权威根整数数据包,可以让系统正常识别并信任各类网站,避免出现证书异常与访问失败问题。 gnupg是开源的加密与签名校验工具,可用于导入第三方软件源公钥&#…...

战略咨询全新定位:结合政策导向规划企业中长期路径

在新形势下、战略咨询的定位逐渐向结合国家政策导向转变和企业在制定中长期发展路径时、须关注政策变化市场动态。在这一背景下政策要素核心在于灵活应对外部环境,企业可以利用定期分析市场动态和政策影响,明确发展方向。结合实际案例与专家观点、这些方…...

2026届最火的六大AI辅助论文网站实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术飞速发展着,智能内容生成也就是AIGC,正一步步渗透到学术…...

Perplexity新闻搜索失效真相:LLM缓存机制、地域策略与时间戳偏移的三重干扰(内部技术备忘录节选)

更多请点击: https://codechina.net 第一章:Perplexity新闻资讯搜索 Perplexity 是一款以实时性、引用可追溯性和多源聚合为特色的 AI 搜索工具,其“新闻资讯搜索”功能专为技术从业者与研究人员设计,支持按时间范围、可信信源&a…...