存在值、右值引用和常數左值引用重載時的重載解析歧義
在C 中,當函數呼叫涉及多個可行的函數時重載,重載決策根據嚴格的部分排序確定最佳匹配。然而,某些場景會引入歧義,如以下程式碼所示:
int f( int ); int f( int && ); int f( int const & ); int q = f( 3 );
雖然此呼叫不明確,但刪除f( int ) 會導致Clang 和GCC 都支援右值引用重載f( int && )超過左值引用f( int const & )。但是,刪除任一引用重載都會導致 f( int ) 出現歧義。
重載解析規則
在重載解析中,函數呼叫中的參數初始化必須是比其他初始化更好的匹配。比較兩種初始化時,其中一種可能會更好、無法區分或更差。在給定的場景中,直接引用綁定的特殊規則使 int && 優於 const int &,但兩者都不比 int 更好或更差。因此,不存在最佳匹配。
右值引用的特殊規則
有趣的是,只有當兩個初始化都涉及引用綁定時,才適用右值引用優於左值引用的規則。但是,當一個初始化是非引用綁定時,如 int 的情況,此規則不適用。
可能的未來擴展
優先考慮的建議重載決策中的 int && over int 旨在提供更有效的機制來處理所有權。透過將引用綁定到初始值設定項,此方法可確保物件被擁有並且可以直接操作,從而可能消除複製的開銷。
以上是為什麼 C 中的 `int`、`int&&` 和 `const int&` 之間的重載解析不明確?的詳細內容。更多資訊請關注PHP中文網其他相關文章!