C++
的枚举底层其实是一个整数类型,这个整数类型称为该枚举值的的底层类型(underlying type
),这个整数类型的范围就是该枚举的取值范围。
怎么说?
有个概念很容易被忽略了,叫枚举基,当然C++11
才有,它的语法在枚举中是这样定义的
枚举关键词 属性(可选) 枚举名(可选) 枚举基(可选) {枚举项列表(可选)}
枚举基格式:冒号(:),后随指某个整数类型,并且该类型作为该枚举类型的固定底层类型。
enum Color : unsigned char {
red = 1,
green,//2
blue = 127,
white ,//128
yellow = 255
};
此时unsigned char
为该枚举类Color
的固定底层类型,并且sizeof(Color)
等于sizeof(unsigned char)
std::cout << sizeof(Color) << std::endl;
std::cout << sizeof(unsigned char) << std::endl;
大小都为1个字节
Color
枚举的取值范围也为unsigned char
的取值范围0~255
,将red
改为-1
,或者将yellow
为256
都提示超出表示范围
Enumerator value evaluates to -1,which cannot be narrowed to type 'unsigned char'
enum Color : unsigned char {
red = 1,
green,//2
blue = 127,
white ,//128
yellow = 255,
black//这里会报错
};
还有个比较意思的是,我们知道如果没有指定枚举项的常量值,那么它的值是会前一个值加1,比如green
为red
的值加1,white
的值为blue
的值加1,但是如果yellow
下面还有个值black
,但不指定值,这时会报错,因为unsigned char
的范围只能在0~255
之间,而black
却应为256
so,C++
枚举的取值范围就是它的底层类型(比如这里的unsigned char
)的取值范围。
如果不指定枚举基,那么其底层类型就不确定,此时底层类型由实现定义的某个能表示所有枚举值的整数类型,此类型不大于int
,除非枚举的值不能放入int
或者unsigned int
。
但是如果我们使用枚举的常量项比较少,可以使用更少字节的整数类型类型来减少内存使用,虽然有点微不足道。