条款10:优先选用限定作用域enum,而非不限定作用域enum
目录条款10优先选用限定作用域enum而非不限定作用域enumPrefer scoped enum to unscoped enum优点分析优点1作用域与命名空间enum class可以避免外围名字空间污染。优点2隐式转换与类型安全enum class可以避免隐式类型转换。优点3底层类型与前置声明enum class可以前置声明降低编译依赖。缺点分析选择之道条款10优先选用限定作用域enum而非不限定作用域enumPreferscoped enumtounscoped enum枚举类型内置类型允许定义一组具有特定名称的常量枚举类型的值在编译时被解析为整数。不限定作用域的枚举类型unscoped enum通过enum声明C98普通枚举、传统枚举、弱类型枚举限定作用域的枚举类型scoped enum通过enum class或enum struct声明C11枚举类、强类型枚举枚举类型的值枚举值 枚举量 枚举成员优点分析优点1作用域与命名空间enum class可以避免外围名字空间污染。理论依据通常而言如果在“大括号{}”里声明一个名字则该名字的作用域可见性就被限定在“大括号{}”之内。然而这个规则不适用于C98风格的枚举类型中定义的枚举量。概念辨析枚举类型所在的作用域 包含着枚举类型的作用域 外围命名空间enum没有定义新的作用域枚举量属于包含着枚举类型的作用域即枚举量的作用域和枚举类型相同因此会泄漏污染到枚举类型所在的作用域。这意味着在此作用域内不能含有相同名字的其他实体否则会导致编译错误或逻辑混淆。enum class定义新的作用域枚举量只属于枚举类型内部的作用域即枚举量的作用域被限定在枚举类型内因此不会泄漏污染到枚举类型所在的作用域。优点2隐式转换与类型安全enum class可以避免隐式类型转换。enum枚举量可以通过隐式类型转换为整数类型并能够从此处进一步转换为浮点类型可能引发未预期的行为。类型不安全、弱类型枚举if条件判断“枚举量red”可以从“Colorenum枚举类型”隐式类型转换为“int整数类型”并进一步地转换为“double浮点类型”从而实现将“Color类型”和“double类型”的值进行比较。函数调用“枚举量red”可以从“Colorenum枚举类型”隐式类型转换为“std::size_t整数类型”从而实现计算一个“Color类型”的质因数。程序分析由上述分析可知尽管下述代码语法合规能通过编译但是语义歪曲不自然。enum class枚举量只能通过强制类型转换static_cast为其他类型不存在任何的隐式转换路径避免意外的类型转换错误。类型安全、强类型枚举优点3底层类型与前置声明enum class可以前置声明降低编译依赖。底层类型underlying type所有的枚举类型都有一个整数类型作为其底层类型或者是默认底层类型或者是显式指定底层类型或者是编译器根据定义自动选择。前置声明forward declaration枚举类型先于枚举量声明。等价表述在指定枚举量之前直接声明枚举类型。理论依据关系只有当编译器能够确定枚举类型的底层类型时最终目的是确定其尺寸才能使用枚举类型。enumC98由于既没有默认底层类型也不支持显式指定底层类型因此不可以前置声明。换言之C98仅支持“枚举类型定义”即列出所有的枚举量以便编译器根据定义来确定底层类型不允许“枚举类型声明”。程序分析对于Color由于只有三个值需要表示因此编译器可能选择char作为底层类型。对于Status由于枚举类型的取值范围较大例如此处需要表示从0到0xFFFFFFFF因此编译器通常会选择比char更大的整数类型作为底层类型除非是在不常见的机型上其中char至少包含32bits。enumC11虽然没有默认底层类型但支持显式指定底层类型因此条件可以前置声明必须显式指定底层类型。enum classC11由于既有默认底层类型int也支持显式指定底层类型因此总是可以前置声明无论是否显式指定底层类型。问题前文指出C98的枚举类型即enum仅支持“枚举类型定义”即列出所有的枚举量不允许“枚举类型声明”。请问这种设计前置声明的缺失有何缺点回答1在C98中枚举enum无法前置声明最大缺点就是增加编译依赖性。考虑enum类型Status这种枚举很可能会在整个系统中被广泛使用因此通常会被放在一个头文件中而系统中的各个部分都会依赖这个头文件。假设后来Status增加了一个新状态值很可能整个系统都必须重新编译即使实际上只有一个子系统甚至可能只有一个函数使用了这个新的枚举值。回答2在C11中枚举enum class和enum允许前置声明从而可以消除上述问题。首先如果修改了Status的定义则包含下述声明的头文件就不需要重新编译。其次如果修改了Status的定义例如增加枚举值audited但continueProcessing的行为并没有受到影响例如因为continueProcessing根本没有使用audited则continueProcessing的实现文件也不需要重新编译。缺点分析鉴于enum class既能避免命名空间污染又能避免隐式类型转换人们很容易认为它在任何情况下都优于enum。然而实际上至少有一种场景enum仍然具有优势并非完全没有用武之地那就是在C11中使用enum枚举值来表示std::tuple各个字段的索引给std::tuple各个字段进行命名。这是因为std::get的模板参数需要整数常量enum恰好能够隐式转换为std::size_t。案例分析假设我们需要为社交网站准备一个std::tuple用于持有名字、电子邮件和声望值。实现1不推荐程序设计访问元素时使用“整数常量”作为std::get的模板类型参数。问题分析在using别名声明中注释清楚地指示出tuple各个字段的对应含义。然而如果在另一个源文件中看到类似“本实现”的代码这些注释并没有多大帮助。作为程序员你是否应该记住“第一个字段”代表“用户的电子邮件”吗不应该增加记忆负担实现2推荐程序设计访问元素时使用“enum的枚举值”作为std::get的模板类型参数。优点分析由于“enum枚举类型”能够隐式类型转换为“std::size_t整数类型”正是std::get要求的类型将“字段编号”与“字段名称”关联起来因此可以避免直接写“魔法数字”消除记忆需求。实现3.1不推荐程序设计访问元素时使用“enum class的枚举值”作为std::get的模板类型参数。问题分析由于“enum class枚举类型”不能隐式类型转换为其他类型因此需要使用static_cast强制类型转换为“std::size_t整数类型”代码啰嗦。若不想那么啰嗦就得写个函数见“实现3.2”。实现3.2不推荐辅助函数设计思路传入枚举值返回其对应的std::size_t值但这有一点技巧性。首先由于std::get是函数模板因此传入的std::size_t类型值是模板类型参数注意此处使用的是而不是()。这意味着将枚举量由“UserInfoFields”变换为“std::size_t”值的函数必须在编译期间就计算出结果因此必须使用constexpr函数见“条款15”。其次由于函数应该能够应用于任何枚举类型因此光是constexpr 函数还不够还得用constexpr函数模板。接着由于返回值也需要进行泛化因此不能返回std::size_t需要返回枚举类型的底层类型可通过类型特征std::underlying_type获得见“条款9”。最终由于函数肯定不会产生异常因此还要将其声明为noexcept见“条款14”。辅助函数具体实现函数模板toUType接受任意类型的枚举量并以编译期常量返回其对应的底层类型的值。程序设计访问元素时使用“enum class的枚举值”作为std::get的模板类型参数。问题分析即使可以借助辅助函数来简化类型转换代码使用enum class还是比enum打的字要多。补充说明enum class可以避免命名空间污染和不经意间地隐式类型转换。在大多数情况下你应该会觉得多敲几个几行字符是合理的代价是值得的以避免enum技术带来的陷阱。选择之道enum需要兼容C语言代码 或 需要与旧系统交互enum class需要更好的作用域控制和类型安全并且编译器支持C11及以上版本enum(传统枚举)enum class(强类型枚举)作用域没有定义新的作用域定义新的作用域访问方式可以直接访问无需添加前缀不能直接访问需要添加作用域维护扩展不易容易类型安全不安全安全打印输出直接cout需要进行显式类型转换底层类型允许明确指定int适用场景需要兼容C语言代码需要与旧系统交互需要更好的作用域控制和类型安全前提编译器需要支持C11及以上版本

相关新闻

【C++】从内存布局到精度取舍:深入解析float与double的底层差异

【C++】从内存布局到精度取舍:深入解析float与double的底层差异

1. 浮点数的内存布局:IEEE 754标准揭秘当你写下float f 3.14f;这行代码时,计算机内部发生了什么?这要从IEEE 754标准说起。这个标准就像浮点数的"宪法",规定了它们如何在内存中安家落户。内存中的三居室:无…

2026/7/15 19:50:49 阅读更多 →
APK安装器:在Windows上无缝运行安卓应用的终极解决方案

APK安装器:在Windows上无缝运行安卓应用的终极解决方案

APK安装器:在Windows上无缝运行安卓应用的终极解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是一个文章写手,你负责为开源项目写专…

2026/7/15 19:48:49 阅读更多 →
对话系统开发全攻略:从NLP原理到部署实践

对话系统开发全攻略:从NLP原理到部署实践

这次我们来看一个名为"挂一个对我朋友开腔的老牧师"的项目,从标题看这似乎涉及某种对话或交互系统。虽然具体技术细节有限,但我们可以从技术角度探讨这类系统的实现方式和应用场景。这类系统通常基于自然语言处理技术,能够识别用户…

2026/7/15 19:46:48 阅读更多 →

最新新闻

LookML+BigQuery构建AI分析代理的语义层实践

LookML+BigQuery构建AI分析代理的语义层实践

1. 项目概述:当LookML遇上BigQuery,AI分析代理的语义层新解法你有没有遇到过这样的场景:业务同学急吼吼地跑来问“上个月华东区高净值客户的复购率是多少”,数据工程师刚把SQL写到一半,发现这个“高净值客户”的定义在…

2026/7/15 23:52:24 阅读更多 →
基于STC89C52与DHT11的智能家居环境调控系统设计与实现

基于STC89C52与DHT11的智能家居环境调控系统设计与实现

1. 项目背景与核心价值想象一下这样的场景:冬天清晨醒来时卧室自动预热到舒适温度,夏天书房湿度超标自动开启除湿模式——这就是用STC89C52单片机和DHT11传感器搭建的智能环境调控系统能实现的真实功能。作为电子爱好者入门智能家居的经典方案&#xff0…

2026/7/15 23:50:24 阅读更多 →
大模型GEO结构化排版:3个格式逻辑让内容优先被提取,零代码提25%引用率附格式对照表

大模型GEO结构化排版:3个格式逻辑让内容优先被提取,零代码提25%引用率附格式对照表

作者:张钧泽(曌选科技 GEO 优化主理人,20 生产级 RAG/GEO 项目经验) 上一篇我们讲了 GEO 答案三层结构法,很多朋友反馈说调整完内容结构之后,引用率确实涨了,但是还有一部分内容核心结论明确、…

2026/7/15 23:50:24 阅读更多 →
Modbus RTU与TCP协议实战解析:从报文结构到网络调试

Modbus RTU与TCP协议实战解析:从报文结构到网络调试

1. Modbus协议基础:从工业现场到以太网第一次接触Modbus是在2013年调试一个污水处理厂的PLC控制系统。当时看着RS-485总线上挂着的十几个流量计和液位传感器,突然意识到这个诞生于1979年的协议至今仍是工业通信的基石。Modbus之所以能穿越40年技术周期&a…

2026/7/15 23:48:23 阅读更多 →
量化实盘异常处理流程:断线、部分成交、重复委托与人工接管

量化实盘异常处理流程:断线、部分成交、重复委托与人工接管

实盘系统出问题时,策略好坏往往不是第一矛盾。网络断线、柜台回报延迟、部分成交、撤单失败和进程重启,都可能让本地状态与真实账户分叉。牛股王股票适合普通A股用户先用信号监控、调仓提醒和风控记录减少长时间盯盘;QMT、PTrade或VeighNa进入…

2026/7/15 23:44:22 阅读更多 →
BERT情感分析实战:从预训练模型微调到工业级批量推理与性能优化

BERT情感分析实战:从预训练模型微调到工业级批量推理与性能优化

文章目录 每日一句正能量 一、前言 二、BERT模型原理与情感分类适配 2.1 BERT核心架构 2.2 情感分类的适配方式 三、环境准备与数据集 3.1 开发环境 3.2 数据集介绍 3.3 数据预处理 四、预训练模型微调(Fine-tuning) 4.1 加载预训练模型 4.2 训练配置 4.3 评估指标定义 4.4 启…

2026/7/15 23:42:22 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/15 17:52:08 阅读更多 →

月新闻