我有一个定义如下的类:
struct X {
X() : data() {}
int data;
enum class Zzz : int { zero, one, two };
Zzz zzz;
};
...
X xval;
xval.zzz的值是未定义的还是X::Zzz.zero?我知道对于常规枚举,它将是未定义的,我想知道类型化枚举是否行为不同。
我有一个定义如下的类:
struct X {
X() : data() {}
int data;
enum class Zzz : int { zero, one, two };
Zzz zzz;
};
...
X xval;
xval.zzz的值是未定义的还是X::Zzz.zero?我知道对于常规枚举,它将是未定义的,我想知道类型化枚举是否行为不同。
它是未初始化的。
由于支持类型是一个int
,并且可以包含陷阱表示,因此在初始化之前读取xval.zzz
的行为是未定义的。(有趣的是,如果支持类型是char
、unsigned char
或signed char
,那么行为只是实现定义。)
{ zero, one, two }
更改为{ zero = 1, one, two }
,则在ideone.com上没有输出。这表明初始化为0,而不是第一个枚举成员的值。请参见https://ideone.com/b9mvD1。 - Bathsheba
enum class
试图将值限制为显式枚举,这是一个不错的尝试。因此,有一种论点认为某种形式的初始化应该自动发生。 - Bathsheba