簡體   English   中英

整數到枚舉轉換的static_cast

[英]static_cast on integer to enum conversion

有一些函數將枚舉作為參數

void myfunc(myEnum input);

據我了解,如果必須為此函數提供整數,建議將其顯式轉換為枚舉,原因是所有整數可能都不是有效的枚舉值。

根據MSDN

“ static_cast運算符可以將整數值顯式轉換為枚舉類型。如果整數類型的值不在枚舉值的范圍內,則所得的枚舉值不確定。”

並按照C ++標准5.2.9靜態轉換-> 10

“整數或枚舉類型的值可以顯式轉換為枚舉類型。如果原始值在枚舉值(7.2)的范圍內,則該值不變。否則,未指定結果值(並且可能不在該范圍)。”

那么在這種情況下使用static_cast什么意義呢? 是否有一些選項會引發枚舉范圍之外的值的異常(除了為此編寫顯式代碼)?

像往常一樣,編譯器只是在試圖阻止您腳踏實地。 這就是為什么您不能僅將int傳遞給需要枚舉的函數。 編譯器理應抱怨,因為int可能不匹配任何有效的enum值。

通過添加強制類型轉換,您基本上可以告訴編譯器“閉嘴,我知道我在做什么” 您在此處傳達的信息是,您確保傳入的值“在枚舉值的范圍內”。 而且,您最好確保是這種情況,否則您將單程前往未定義的行為領域。

如果這樣做很危險,那么為什么編譯器不為整數值添加運行時檢查? 原因是與C ++一樣經常出現性能問題。 也許你只是從周圍的程序邏輯知道 int值將始終是有效的,你絕對不能浪費在無意義的運行時檢查的任何時間。 從語言設計的角度來看,這可能不是最合理的默認選擇,尤其是當您的目標是編寫可靠的代碼時。 但這就是C ++的工作方式:開發人員永遠不必為自己可能不想使用的功能付費。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM