c++ 关于包含与任何枚举数都不对应的基础类型的值的范围枚举的值

d7v8vwbk  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(137)

基本上鉴于

enum class Color : int { R, G, B };
Color c;

c是否有可能最终持有RGB以外的内容,或者换句话说,持有012以外的底层int
我知道上面的c声明使其未初始化,并且

Color c{};

将其初始化为R/0
然而,我发现如果枚举的定义是

enum calss Color : int { R = 1, G, B };

那么{}初始化的c将具有值0,该值不对应于R/G/B中的任何一个(我已经验证了对于从RGB中选择的任何 * enumerator *,c == Color::enumerator``返回false;且static_cast<int>(c)为0)。
现在这个,在我看来有点尖锐:如果0不支持任何枚举器,那么为什么{}-initialization将该值赋予支持的int

u2nhd7ah

u2nhd7ah1#

Color是作用域枚举类型,因此其基础类型是固定的。(在您的示例中,您已将其显式指定为int,但如果未显式指定,作用域枚举也会默认为int。您还可以为未作用域枚举显式指定基础类型。)
对于一个底层类型固定的枚举,底层类型的所有值都是该枚举的有效值。也就是说,Color可以包含任何int值。如果它包含一个它的枚举器都没有的值,那就意味着它不会与它的任何枚举器进行比较。这可能看起来有点奇怪,但另一种选择是给予程序一个未定义的行为。大多数人都会同意,在C++中,我们不需要任何未定义的行为。
(For一个底层类型不固定的枚举,规则就有点复杂了。通常仍然可以给予它们不对应于任何枚举数的值,但是允许值的范围更窄了。超出这个范围会导致未定义的行为。)

j0pj023g

j0pj023g2#

c得到零值,因为使用{}值初始化c,并且对于内置类型(这是枚举的基础),这总是零初始化。
还可以使用static_cast手动分配不在枚举列表中的值,如

c = static_cast<Color>(42);

相关问题