[EMC++] Item 10. Prefer scoped enums to unscoped enums

news/2024/7/2 5:33:18

条款十 倾向使用范围enum

简介

一般来说,在大括号内定声明的名字只在括号内可见,但是C++98的枚举是个例外,名字属于包含enum关键字的作用域。

// this kind of enum: unscoped
enum Color {black, white, red};
auto white = false; // error

C++14enum则改变了这种情况:

enum class Color {black, white, red};
auto white = false; // fine
Color c = white; // error
Color c = Color::white; // fine
auto c = Color::white; // fine

由于范围内的枚举使用enum class,所以有时也被称作枚举类。

此外,范围enum是强类型的,非范围enum则会隐式转换为整型。

// 正常的代码
enum Color {black, white, red};
std::vector<std::size_t> primeFactors(std::size_t x);
Color c = red;
if(c < 14.5) {
    auto factors = primeFactors(c);
}

在添加class后,上述代码出现错误,除非使用cast显式转换。

// 正常的代码
enum class Color {black, white, red};
std::vector<std::size_t> primeFactors(std::size_t x);
Color c = Color::red;
if(static_cast<double>(c) < 14.5) {
    auto factors = primeFactors(static_cast<std::size_t>(c));
}

此外,范围enum可以提前声明,即可以先声明枚举类,之后再指出具体枚举值。

当处理std::tuple的时候,非范围enum则十分有用。

总结

  • C++98风格的enum如今被称为非范围enum

  • 范围enum的枚举值只在enum内可见,且只能通过cast转换为其他类型

  • 范围和非范围enum都支持指定底层类型。范围enum的默认底层类型是int,而费范围没有

  • 范围enum可以提前声明。非范围类型只有在他们的声明指定底层类型的时候才可以提前声明


http://www.niftyadmin.cn/n/3746532.html

相关文章

linux中tomcat关不掉服务(Shutdown.sh)Could not contact localhost:8005.

3种都试一下&#xff0c;也许能行得通&#xff01; 1、修改jre下面的"Java.security"配置文件&#xff08;这种方法可能对jdk8有用&#xff09; &#xff08;1&#xff09;进入目录 # JDK_PATH是jdk的安装目录 # cd JDK_PATH/jre/lib/security/ &#xff08;2&#…

Tomcat本地测试未申请下来的域名,并建立和测试二级域名

在网站开发前期没有申请域名或者域名没有申请下来&#xff0c;但又想先在本地测试未来的域名&#xff0c;并建立和测试二级域名。一个ip地址对应多个域名。 假设现在已经有一个顶级域名"website.com"&#xff0c;并建立了两个二级域名"user.website.com"、…

github上传工程

1 常用命令 # 创建本地文件夹 mkdir MasonYyp ​ # 进入目录 cd MasonYyp ​ # 查看仓库状态 git status ​ # 克隆远端仓库 git clone "地址" ​ # 更新本地仓库 # origin远端仓库别名&#xff0c;master分支名 git pull origin master ​ # 推送到远端仓库 git pus…

jsoncpp的api简要说明

1 jsoncpp的api简要说明 1,解析(json字符串转为对象) std::string strDataJson; Json::Reader JReader; Json::Value JObject; if (!JReader.parse(strDataJson, JObject)) { cerr << "parse json error." << endl; return bSuccess; } 2,读取 std::st…

数字三角形(蓝桥杯 动态规划)

问题描述&#xff08;图&#xff13;.&#xff11;&#xff0d;&#xff11;&#xff09;示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路径&#xff0c;使该路径所经过的数字的总和最大。●每一步可沿左斜线向下或右斜线向下走&#xff1b;●1&#xff1c;三角…

Html页面head标签元素的意义和应用场景

相信在html5之前&#xff0c;很少人会关注html页面上head里标签元素的定义和应用场景&#xff0c;可能记得住的只有"title"、"keyword"和"description"这些meta在逐渐了解使用html新标准后&#xff0c;特别是移动页面的开发普及&#xff0c;可以…

带你玩转 Big Data

Big Data&#xff08;大数据&#xff09;技术简析Big Data是近来的一个技术热点&#xff0c;但从名字就能判断它并不是什么新词。毕竟&#xff0c;大是一个相对概念。历史上&#xff0c;数据库、数据仓库、数据集市等信息管理领域的技术&#xff0c;很大程度上也是为了解决大规…

Spring Cloud config之一:分布式配置中心入门介绍

Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持。配置服务器为各应用的所有环境提供了一个中心化的外部配置。它实现了对服务端和客户端对Spring Environment和PropertySource抽象的映射&#xff0c;所以它除了适用于Spring构建的应用程序&#xff0c;也…