首頁 >後端開發 >C++ >C 11 中刪除的函數如何影響重載解析?

C 11 中刪除的函數如何影響重載解析?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-15 15:22:24383瀏覽

How Do Deleted Functions in C  11 Influence Overload Resolution?

C 11 中已刪除函數的重載解析

C 11 允許使用 = delete 語法標記函數為「已刪除」。 「此語法阻止編譯器產生函數體並禁止其直接呼叫。但是,這些刪除的函數仍然參與重載決策,該過程根據給定的一組輸入參數確定要調用的最合適的函數。

此功能為何有用?會被隱藏而不是從程式碼中完全刪除?以下範例:

如果delete 完全刪除了該函數,則它實際上會使= delete 語法等效於:
struct onlydouble {
  onlydouble(std::intmax_t) = delete;
  onlydouble(double);
};

透過此更改,以下程式碼將合法:
struct onlydouble2 {
  onlydouble2(double);
};

編譯器會在呼叫採用a 的建構子之前嘗試將整數文字20隱式轉換為雙精度數double.
onlydouble2 val(20);

相較之下,在刪除建構子的原始範例中,編譯器將偵測函數參數(std::intmax_t) 和參數(20) 之間的精確匹配。語法可以更好地控制根據參數類型呼叫哪些函數。規範中不是必需的,因為:

存在特殊語法刪除函數(「我禁止這個」)

隱式定義的函數(例如複製建構子)存在於默認

重載解析透過辨識不符或歧義來處理函數「存在」
  • 刪除函數的主要目的是控制重載解析,而不是指示不存在

以上是C 11 中刪除的函數如何影響重載解析?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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