在下面的代碼中,我使用static_cast
將強類型enum
轉換爲int
。另一方面也是如此。但是如果演員int
不在enum
的範圍內,它也可以工作。爲什麼是這個,爲什麼編譯器沒有捕獲這個?爲什麼強制類型枚舉編譯爲「不在枚舉範圍內」的int?
#include <iostream>
#include <string>
enum class Name {Hans, Peter, Georg}; // 0, 1, 2
std::string getName(Name name) {
switch(name) {
case Name::Hans: return "Hans";
case Name::Peter: return "Peter";
case Name::Georg: return "Georg";
default: return "not valid name";
}
}
int main()
{
// Cast a Name to an int, works fine.
std::cout<< static_cast<int>(Name::Peter) <<std::endl; // 1
std::cout<< static_cast<int>(Name::Hans) <<std::endl; // 0
// Cast an int to a Name
std::cout<< getName(static_cast<Name>(2)) <<std::endl; // Georg
std::cout<< getName(static_cast<Name>(3)) <<std::endl; // not a valid name
// I would expect a compiler error/warning like i get here:
// std::cout<< static_cast<int>(Name::Hans + 4) <<std::endl;
}
您認爲編譯器應該「抓住」這個基礎的基礎是什麼?據我所知,C++標準不需要任何診斷。 – nwp
爲整數值的有效性添加檢查會強加運行時開銷。 – Bernard
當我取消註釋最後一行'不匹配'operator +'(操作數類型是'Name'和'int')'時,得到的錯誤與您的關於枚舉範圍的問題沒有任何關係。 – Kevin