2016-09-02 52 views
4

或者另一種說法是:編譯器是否可以假定enum的實例只能保存它聲明的值並基於該假設進行優化?編譯器是否允許優化依賴於具有未聲明值的枚舉的分支?

enum MyType { A = 1, B = 2 }; 

const MyType C = static_cast<MyType>(3); 

void fun(MyType m) { 
    switch (m) { 
     case A: 
      // ... 
      break; 
     case B: 
      // ... 
      break; 
     case C: 
      // can this be optimized away? 
    } 
} 
+0

目前還不清楚你在問什麼?爲什麼'C'情況要優化呢?我看不出有明確的理由。 –

+4

@πάνταῥεῖ,因爲它沒有包含在MyType列表中。 'g ++'至少會警告'case'值'3'不在枚舉類型'MyType'中 –

+0

@RyanHaining如果你執行'const MyType C = static_cast (value)''''''比如更新你的簡歷並向法院提交法律名稱更改,以便你的同事不會因爲未來的程序員工作而感到羞愧。 – kfsone

回答

4

編譯器無法優化未聲明的枚舉值。語言規範中關於統計員的部分說

可以定義一個枚舉值,該枚舉值不是由其任何枚舉​​器定義的枚舉值。

所以枚舉被允許具有未在枚舉聲明中明確指定的值。

此外,關於位掩碼類型的部分給出了使用未定義的枚舉值的示例,具體提及0作爲有效標誌值。

由於枚舉值未被聲明是有效的,因此編譯器無法優化使用它們的代碼。

+1

種類正確。有些值可能不在枚舉器列表中,這並不意味着所有整數值都是枚舉的有效值。請參閱http://stackoverflow.com/a/4969304/87234 – GManNickG