首頁 >後端開發 >C++ >為什麼刪除的 C 11 函數仍然參與重載解析?

為什麼刪除的 C 11 函數仍然參與重載解析?

Linda Hamilton
Linda Hamilton原創
2024-12-23 10:13:18269瀏覽

Why Do Deleted C  11 Functions Still Participate in Overload Resolution?

為什麼重載解析包括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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn