為什麼重載解析包括C 11 刪除的函數
C 11 引入了= delete 語法,它將函數標記為「已刪除”,從而防止他們的召喚。這就提出了一個問題,為什麼這些函數仍然參與重載決策而不是完全消除。
=delete 的主要目的是防止呼叫帶有某些參數的特定函數。它的目的是禁止隱式轉換,特別是在可能導致意外後果的情況下。因此,參與重載決策對於=delete有效禁止特定重載至關重要。
考慮以下範例:
struct onlydouble { onlydouble(std::intmax_t) = delete; onlydouble(double); };
如果 =delete完全刪除了函數,它將具有相同的效果效果如下:
struct onlydouble2 { onlydouble2(double); };
在這種情況下,以下程式碼將是valid:
onlydouble2 val(20);
編譯器會嘗試呼叫採用整數的建構函數,但會隱式將20 轉換為雙精度數並成功調用採用雙精度數的建構函數。
但是,使用 = delete 時,明確禁止呼叫採用 intmax_t 的 onlydouble 建構子。編譯器不會嘗試隱式轉換,而是會發出錯誤,從而阻止使用此禁止的重載。
此外,= delete 意味著「我禁止此」而不是「此不存在」。 C 規範沒有定義「不存在」函數的概念。相反,它提供了一種明確禁止某些呼叫的機制,允許程式設計師控制編譯器的行為並防止不必要的隱式轉換。
以上是為什麼刪除的 C 11 函數仍然參與重載解析?的詳細內容。更多資訊請關注PHP中文網其他相關文章!