不初始化的c++ enum类默认值



未初始化的enum class变量的默认值是多少?下面的代码打印出奇怪的结果。

#include <iostream>
#include <cstdio>
using namespace std;
struct C {
C() {
m_a = 1;
}
enum class E:bool {
a = false,
b = true,
};
int m_a;
E m_e;
};
int main()
{
C c;
cin >> c.m_a;
printf("m_e: %d; compare to C::E::a: %dn", static_cast<int>(c.m_e), c.m_e == C::E::a);
return 0;
}

使用gcc版本9.4.0构建(Ubuntu 9.4.0-1ubuntu1~20.04.1)

g++ -g -o c c.cpp
# run, input 1 and get the result.
./c
1
m_e: 252; compare to C::E::a: 253
# run c, input 2 and get the result.
./c
2
m_e: 254; compare to C::E::a: 255

Q1:为什么m_e没有初始化为C::E::a(值false == 0?)或C::E::b(值true == 1?)

Q2:为什么比较表达式c.m_e == C::E::a返回253/255,但不是false(值0)或true(值1)?

未初始化的enum类变量的默认值是多少?

它是不确定的,因为你没有初始化它。因此,从c.m_e读取将使您的程序具有未定义的行为,并且程序可能显示几乎任何值-或没有值并崩溃(甚至更糟)。

E m_e;改为

E m_e{};

,它将被初始化为0,在你的例子中意味着false

注意:如果0实际上不是定义的枚举数之一,则初始化enum class为零可能会导致混淆的结果。尽管如此,它将对enum class的基类型进行零初始化。

最好是明确的:

E m_e{E::a};

Q1:为什么m_e没有初始化为C::E::a(值false == 0?)或C::E::b(值true == 1?)

因为,它没有初始化,任何东西都可能显示——或者根本不显示

Q2:为什么比较表达式c.m_e == C::E::a返回253/255,而不返回false(值0)或true(值1)?

。程序的行为未定义

注意:在当前的MSVC中,当您执行cin >> c.m_a;并稍后打印c.m_e的值时,它将显示您在c.m_a中输入的值。很奇怪吗?不,这只是未定义行为可能出现的一种方式。

最新更新