考慮這個簡單的代碼:爲什麼的std :: underlying_type <T>無符號當T是不是?
int main() {
enum Simple { one = 1, two = 2 };
Simple m1 = static_cast<Simple>(-1);
if (m1 < 0) return -1;
return 1;
}
不出意外,這將返回-1。
令人驚訝的是,當我使用的std :: underlying_type <簡單>,基本類型是「無符號整型」。跆拳道?如果Simple的基礎類型是無符號的,它是如何得到小於零的?
進一步的證據:
int main(int argc, char *argv[]) {
enum Simple { one = 1, two = 2 };
Simple m1 = static_cast<Simple>(-1);
std::underlying_type<Simple>::type underlying = m1;
long long llm1 = m1;
std::cout << "simple=" << m1
<< " underlying=" << underlying
<< " long long=" << llm1
<< "\n";
}
產地:
簡單= -1底層= 4294967295長長= 4294967295
隱式轉換和積分的組合促銷,我會下注。 –
如何編譯甚至不編譯,產生輸出? –
而不'class'或顯式基礎類型的基礎類型枚舉是*實現定義*除了它不允許比'int'大的類型,除非統計員不能適合在'int'。你的第一個例子表明(在C++ 17之前!)你的編譯器使用一個簽名類型作爲基礎類型。如果'std :: underlying_type'實際上解析爲'unsigned int',那麼這兩種情況的組合將表示編譯器錯誤。但是你應該張貼一些證據表明'的std :: underlying_type '其實'根據你的要求 –