《Effective Modern C++》学习笔记 - Item 10: 倾向于使用有界的枚举(scoped enum)而不是无界的枚举(unscoped enum)

本文对比了C++98中的unscoped enum与C++11引入的scoped enum的区别,包括名称作用域、类型转换、底层类型指定及前向声明等方面,并探讨了它们各自的适用场景。
  • 一般在大括号内声明的名称(name,或者严谨点说标识符)的可见范围是限制在大括号内的。然而C++98中的 enum 不同:它内部定义的名称会泄露到定义 enum 自身的区域中。因此也得名 unscoped enum
enum Color {
   
    black, white, red };
auto white = false; // VS报错: main::white重定义
  • C++11版本的 scoped enums 通过 enum class 定义,不会导致名称的泄露:
enum class Color {
   
    black, white, red };
Color c = white;		// error, 找不到white
Color c = Color::white;	// ok
auto c = Color::white;	// ok
  • scoped enums 的第二个好处:枚举值为强类型,不会被意外地隐式转为整型(甚至接着被转为浮点型)。如果真的想进行转换,用最正确的方法,调用 cast
enum class Color {
   
    black, white, red };

Color c = red;			// error
Color c = Color::red;	// ok

if (c < 14.5) {
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值