在提供的程式碼中,函數 function 被宣告為接受整數參數。然而,由於隱式轉換,它也會無意中接受字元、布林值和長整型。為了防止這種不良行為,我們尋求方法來強制執行嚴格的類型匹配並禁止隱式轉換。
避免隱式轉換的一種方法是定義函數模板匹配除所需類型之外的所有類型。例如,我們可以為其他類型建立一個模板,並將其標記為已刪除,從而有效地禁止其編譯:
void function(int); // this will be selected for int only template<class T> void function(T) = delete; // C++11
這樣,就可以與非模板函數直接匹配,在本例中為void 函數(int),將始終選擇整數。任何嘗試使用其他類型呼叫該函數都會因刪除的模板而觸發錯誤。
在 C 11 之前,需要不同的方法實現類型嚴格的函數呼叫而無需隱式轉換。這涉及建立一個DeleteOverload 類別並使用它來停用非所需類型的重載選擇:
// because this ugly code will give you compilation error for all other types class DeleteOverload { private: DeleteOverload(void*); }; template<class T> void function(T a, DeleteOverload = 0); void function(int a) {}
C 23 引入了一個更使用者友善的方法使用static_assert(false, msg) 的方法。這允許在類型不匹配時提供更清晰的錯誤訊息:
void function(int) {} // this will be selected for int only template<class T> void function(T) { // since C++23 static_assert(false, "function shall be called for int only"); } int main() { function(1); // function(1l); // ^^^^^^^^^^^^ produces error: // error: static assertion failed: function shall be called for int only }
透過採用這些技術,我們可以避免非構造函數中的隱式轉換,確保更嚴格的類型檢查並消除潛在的錯誤由無意的類型不匹配引起。
以上是如何防止非構造 C 函數中的隱式型別轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!