2017-06-01 141 views
1

在下面的代碼中,我使用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; 
} 
+2

您認爲編譯器應該「抓住」這個基礎的基礎是什麼?據我所知,C++標準不需要任何診斷。 – nwp

+0

爲整數值的有效性添加檢查會強加運行時開銷。 – Bernard

+0

當我取消註釋最後一行'不匹配'operator +'(操作數類型是'Name'和'int')'時,得到的錯誤與您的關於枚舉範圍的問題沒有任何關係。 – Kevin

回答

0

一方面,人們常常用枚舉表示位標誌:

enum class FontFlags { bright=0x1, bold=0x2, blink=0x4 }; 

現在,他們希望這項工作:

FontFlags(int(FontFlags::bold) | int(FontFlags::blink)) 

但當然值是6,其「不可能。」

+0

強類型枚舉(帶'enum class')不支持'operator |'。 – Kevin

+0

@Kevin:已更新以解決該問題。 –

+0

雖然我認爲這種做法有失敗目的。如果您需要轉換爲「int」,然後才能獲得枚舉的「不可能」值,則不再有有效的枚舉。 – Kevin