考慮程式碼片段:
enum class Color : char { red = 0x1, yellow = 0x2 }; char *data = ReadFile(); Color color = static_cast<Color>(data[0]);
會發生什麼當data[ 0] 為100 時?根據 C 11 和 C 14 標準,結果值未指定,這表示它可以是任何值。
但是,在CWG 1766 之後,將枚舉範圍之外的值轉換為枚舉類型現在可以調用未定義行為(UB)。此變更僅影響選擇將缺陷套用到其 C 11 和 C 14 編譯模式的編譯器實作。
在 switch 中語句中,條件轉換為整數。對於無作用域枚舉,此轉換適用於整數;對於作用域枚舉(枚舉類別和枚舉結構),不會發生提升。無論如何,條件值在基礎類型和 int 的範圍內,因此仍應命中預設標籤。
For沒有固定基礎類型的枚舉,將值轉換到範圍之外可能會導致未指定的行為(在CWG 1766 之前)或UB(在CWG 1766)。這可以用列舉 ColorUnfixed 來說明:
enum ColorUnfixed { red = 0x1, yellow = 0x2 };
由於基礎型別不固定,ColorUnfixed 的範圍是從 0 到 3,因此 100 是無效值。
以上是將無效值轉換為 C 中的枚舉類別時會發生什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!