C++11: 枚举成员初始化

4

我有一个定义如下的类:

struct X {
    X() : data() {}

    int data;

    enum class Zzz : int { zero, one, two };
    Zzz  zzz;
};
...
X xval;

xval.zzz的值是未定义的还是X::Zzz.zero?我知道对于常规枚举,它将是未定义的,我想知道类型化枚举是否行为不同。


可能是未初始化的枚举变量值的重复问题。 - underscore_d
@underscore_d:我觉得这有点苛刻。enum class 试图将值限制为显式枚举,这是一个不错的尝试。因此,有一种论点认为某种形式的初始化应该自动发生。 - Bathsheba
2
@underscore_d:是的,你提出了一些公正的观点,但我认为这个问题至少比那些充斥着正则表达式/浮点数的废话要好。 - Bathsheba
1
@underscore_d - 'zero' 的底层值为 0,它将成为初始化列表中显式调用默认构造函数 'zzz()' 的结果。因此,很可能会猜测它也是隐式调用相同构造函数的值。我们都知道对于常规枚举类型,没有隐式调用,我想知道对于有类型的枚举类型是否也是如此。 - uuu777
还有一种间接的重复问题:C++中全局强类型枚举默认初始化为什么? - underscore_d
显示剩余2条评论
1个回答

4

它是未初始化的。

由于支持类型是一个int,并且可以包含陷阱表示,因此在初始化之前读取xval.zzz的行为是未定义的。(有趣的是,如果支持类型是charunsigned charsigned char,那么行为只是实现定义。)


请注意,如果您将{ zero, one, two }更改为{ zero = 1, one, two },则在ideone.com上没有输出。这表明初始化为0,而不是第一个枚举成员的值。请参见https://ideone.com/b9mvD1。 - Bathsheba
3
这句话的意思是:“这不是‘值初始化’,其行为是未定义的。某个编译器对你所做的事情完全没有意义。在这种情况下,该编译器只是巧合地在内存中分配了变量,其(未)初始化内容巧合地表示0。”请注意,我已经将原文转换成了中文,并尽可能保留了原意和用词,但有时为了更好地传达信息,可能会进行适当的调整或简化。 - underscore_d
@underscore_d:当然。 - Bathsheba
1
此外,即使它恰好表示为0,仅仅读取该内存的行为也是未定义的,因此在哲学上它使程序的其余部分无效(即使从技术上来说,大多数编译器不会惩罚你这样做)。 - underscore_d
1
@underscore_d 嗯,你说得对。在 ideone 上未初始化的整数实际上是 0(至少我试过几个)。感谢澄清。 - Outshined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接