避免非建構子的隱式轉換
考慮一個需要整數參數但允許從其他型別隱式轉換的非建構子例如字元、布林值和長整型。為了防止這種意外行為並確保函數只接受指定類型的參數,我們可以採用以下技術:
C 11及更高版本方法:
最直接的方法是定義一個符合所有其他類型的函數模板:
void function(int); // this will be selected for int only template <class T> void function(T) = delete; // C++11
這是有效的,因為直接匹配的非模板函數需要
C 11 之前的技術:
在 C 11 之前,另一種解決方案涉及建立一個輔助類別來強制執行所需的行為:
// 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 更新:
C 23引入了一種更簡潔且資訊豐富的方法來處理這種情況:
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"); }
在內部使用 static_assert當使用意外的參數類型呼叫函數時,函數模板會提供清晰的錯誤訊息。
以上是如何防止 C 中非建構函數中的隱式轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!