首頁 > 後端開發 > C++ > 如何防止非構造 C 函數中的隱式型別轉換?

如何防止非構造 C 函數中的隱式型別轉換?

Mary-Kate Olsen
發布: 2024-12-06 10:26:11
原創
1078 人瀏覽過

How Can I Prevent Implicit Type Conversions in Non-Constructing C   Functions?

避免非建構子中的隱式轉換

在提供的程式碼中,函數 function 被宣告為接受整數參數。然而,由於隱式轉換,它也會無意中接受字元、布林值和長整型。為了防止這種不良行為,我們尋求方法來強制執行嚴格的類型匹配並禁止隱式轉換。

使用函數模板強制類型不匹配

避免隱式轉換的一種方法是定義函數模板匹配除所需類型之外的所有類型。例如,我們可以為其他類型建立一個模板,並將其標記為已刪除,從而有效地禁止其編譯:

void function(int); // this will be selected for int only

template<class T>
void function(T) = delete; // C++11
登入後複製

這樣,就可以與非模板函數直接匹配,在本例中為void 函數(int),將始終選擇整數。任何嘗試使用其他類型呼叫該函數都會因刪除的模板而觸發錯誤。

使用刪除重載的 Pre-C 11 方法

在 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 用於強制類型約束的靜態斷言

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板