為什麼C 11 刪除的函數參與重載解析
C 11 引入了= delete 語法來防止呼叫某些函數重載參數類型。這種行為可能看起來不尋常,因為人們可能會期望在重載決策期間將已刪除的函數完全從考慮中刪除。但是,做出此設計決策是有特定原因的。
防止隱式轉換
= delete 的一個主要目的是禁止在某些情況下使用隱式轉換。當刪除重載的函數參與重載決策時,它可以確保編譯器選擇完全匹配或報告錯誤。這可以防止使用隱式轉換無意中呼叫已刪除的重載。
考慮下面的範例:
struct onlydouble { onlydouble(std::intmax_t) = delete; // Prevent implicit conversion from integer onlydouble(double); };
如果已完全刪除已刪除的重載,則允許使用以下程式碼:
onlydouble val(20);
編譯器會隱式地將整數文字轉換為double 並選擇未刪除的重載。但是,當刪除的重載參與重載解析時,編譯器會拒絕該程式碼,因為它將刪除的重載標識為與整數文字參數完全匹配。
特殊語法與“這不存在”
有人可能會問為什麼C 11 將= delete 定義為“我禁止這個”而不是“這個不存在” 。答案在於不需要明確的語法來表示不存在。未定義的標識符和缺少的特殊成員函數隱式地傳達了「this 不存在」的概念。
結論
C 11 刪除函數參與重載解析以防止隱式轉換並強制使用某些參數類型。此設計功能允許精確控制函數重載的調用,在不需要隱式轉換或導致歧義的情況下提供優勢。
以上是為什麼 C 11 刪除的函數仍然參與重載解析?的詳細內容。更多資訊請關注PHP中文網其他相關文章!