enum class类型变量是否可以取完整的整数取值范围?
问题1:color_t color = (color_t)999; 写法是否合法
是合法写法。
你这里用的C风格强制转换等价于static_cast<color_t>(999),符合C++标准语法。只要转换的整数值落在color_t底层类型的可表示范围内,行为就是完全明确定义的,哪怕这个值没有对应你声明的red/green/blue命名枚举项,也可以正常使用。
问题2:编译器是否可能将color_t的底层类型设定为char导致999溢出
默认情况下不可能,这个规则要区分普通枚举和作用域枚举:
- 普通无作用域枚举(也就是你举的第一个例子里的
enum { red, green, blue };)如果不显式指定底层类型,编译器会选择能容纳所有枚举值的最小整数类型,这种场景下枚举值只有0、1、2,编译器确实可能选char作为底层类型,存999会溢出。 - 但你这里用的是作用域枚举(
enum class/enum struct),C++标准明确规定,作用域枚举不显式指定底层类型时,默认底层类型就是int,不存在编译器自动换成char的情况。999完全在int的可表示范围内(主流平台int为32位,可表示范围是-231到231-1,即便是16位int也能覆盖999的取值),默认情况下不会溢出。
问题3:显式声明底层类型enum class color_t: int是否能解决问题
可以解决,而且是更稳妥的写法。
显式指定底层类型相当于强制固定了color_t的存储类型为int,不受编译器实现、后续新增枚举值的影响,完全可以避免底层类型过小导致的溢出问题。如果你的业务场景需要存储超出int范围的值,也可以按需显式指定为unsigned int、long等其他整数类型。
内容的提问来源于stack exchange,提问作者rwallace
相关产品推荐
相关产品推荐

