給定三個不同參數類型的重載函數(值、右值引用、const 左值引用),如果所有三個重載都可行,則函數呼叫可能會變得不明確。本文討論了在此類場景中管理重載決策的規則,並探討了在 C 中觀察到的細微行為。
只考慮一個參數,該規則規定一個參數初始化必須是比兩者另外兩個更好的匹配。比較兩個初始化時,要麼認為其中一個更好,要麼都認為兩者都更好(無法區分)。
如果沒有直接引用綁定的特殊規則,這三個初始化在所有三個比較中將無法區分。然而,這些特殊規則將 int&& (右值引用)提升到高於 const int& (左值引用),但兩者都不被認為比 int (值)更好或更差。因此,不會出現最佳匹配。
以下矩陣說明了此行為:
S1 S2 int int&& indistinguishable int const int& indistinguishable int&& const int& S1 better
此矩陣顯示 int&& 優於 const int&基於 C 標準第 13.3.3.2 條。此規則適用於不引用沒有 ref 限定詞的非靜態成員函數的隱式物件參數的參考綁定,並且其中 S1 將右值引用綁定到右值,而 S2 則綁定左值引用。
但是,當其中一個初始化不是引用綁定時,此規則不適用,因此存在歧義。
作者建議將int&& (右值引用)視為比int (值)更好的匹配,因為引用必須綁定到初始值設定項,而物件類型不受此類約束。這可能會建立一個新的重載解析規則,該規則優先考慮來自初始值設定項目的綁定。然而,這個提議需要透過 isocpp 未來提案平台進行進一步討論和潛在的標準化。
以上是Value、Rvalue Reference 和 Const Lvalue Reference 參數之間何時會出現 C 重載解析歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!