关于限定作用域枚举持有非枚举成员底层值及初始化的疑问
C++枚举类初始化疑问
问题场景1
给定代码:
enum class Color : int { R, G, B }; Color c;
请问变量c是否可能持有R、G、B之外的取值?或者说,其底层int类型值是否可能为0、1、2以外的数值?
已知上述声明中的c处于未初始化状态,而
Color c{};
会将其初始化为R/0。
问题场景2
若枚举定义改为:
enum class Color : int { R = 1, G, B };
此时经{}初始化的c取值为0,该值并不对应R、G、B中的任何一个枚举成员(已验证c == Color::enumerator对任一枚举成员均返回false,且static_cast<int>(c)结果为0)。
疑问:若0并不对应任何枚举成员,为何{}初始化会将该值赋予其底层int类型?
问题解答
关于未初始化的Color c;
未初始化的自动存储期枚举变量(比如函数内定义的c)属于未定义行为,它的底层值可以是int范围内的任意数值,完全取决于内存中的随机残留值,自然可能持有R/G/B之外的取值。
关于{}初始化的行为
C++中,{}初始化(值初始化)对于固定底层类型的枚举类有明确规则:
- 当枚举指定了底层类型(比如这里的
: int),值初始化会直接将底层类型设置为零值,不管枚举成员有没有对应这个数值。 - 枚举类型的对象本质是底层整数类型的包装,它允许持有底层类型范围内的所有值,而非仅枚举成员定义的那些取值。
所以在第二个场景中,Color c{};会把底层int初始化为0,哪怕Color里没有对应0的枚举成员,这完全符合C++标准规则。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

