沒有初始化的enum class
變量的默認(rèn)值是多少?下面的代碼打印出奇怪的結(jié)果。
#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: %d\n", 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
(數(shù)值true == 1
問題2:為什么比較表達(dá)式c.m_e == C::E::a
返回253/255,而不是false
(值0)或true
(數(shù)值1)?
它是不確定的,因為您從未初始化過它。因此,從
c.m_e
讀取將使您的程序具有未定義的行為,并且程序可能只顯示任何值-或者沒有值并崩潰(或者更糟)。將
E m_e;
更改為它將被初始化為零,這在您的情況下意味著
false
。注意:如果
0
實際上不是一個定義的枚舉數(shù)的值,則初始化enum class
的零可能會導(dǎo)致結(jié)果混亂。盡管如此,它還是會對enum class
的基類型進行零初始化。最好是明確的:
因為,它沒有被初始化,任何東西都可能出現(xiàn)——或者根本不出現(xiàn)。
再一次程序的行為未定義。
注意:在當(dāng)前的MSVC中,當(dāng)您執(zhí)行
cin >> c.m_a;
并稍后打印c.m_e
的值時,它將顯示您在c.m_a
中輸入的值。奇怪的不,這只是未定義行為可能出現(xiàn)的一種方式。