基本上鉴于
enum class Color : int { R, G, B };
Color c;
c
是否有可能最终持有R
、G
、B
以外的内容,或者换句话说,持有0
、1
或2
以外的底层int
?
我知道上面的c
声明使其未初始化,并且
Color c{};
将其初始化为R
/0
。
然而,我发现如果枚举的定义是
enum calss Color : int { R = 1, G, B };
那么{}
初始化的c
将具有值0
,该值不对应于R
/G
/B
中的任何一个(我已经验证了对于从R
、G
、B
中选择的任何 * enumerator
*,c == Color::
enumerator``返回false
;且static_cast<int>(c)
为0)。
现在这个,在我看来有点尖锐:如果0
不支持任何枚举器,那么为什么{}
-initialization将该值赋予支持的int
?
2条答案
按热度按时间u2nhd7ah1#
Color
是作用域枚举类型,因此其基础类型是固定的。(在您的示例中,您已将其显式指定为int
,但如果未显式指定,作用域枚举也会默认为int
。您还可以为未作用域枚举显式指定基础类型。)对于一个底层类型固定的枚举,底层类型的所有值都是该枚举的有效值。也就是说,
Color
可以包含任何int
值。如果它包含一个它的枚举器都没有的值,那就意味着它不会与它的任何枚举器进行比较。这可能看起来有点奇怪,但另一种选择是给予程序一个未定义的行为。大多数人都会同意,在C++中,我们不需要任何未定义的行为。(For一个底层类型不固定的枚举,规则就有点复杂了。通常仍然可以给予它们不对应于任何枚举数的值,但是允许值的范围更窄了。超出这个范围会导致未定义的行为。)
j0pj023g2#
c
得到零值,因为使用{}
值初始化c
,并且对于内置类型(这是枚举的基础),这总是零初始化。还可以使用
static_cast
手动分配不在枚举列表中的值,如