值、右值參考、常數左值引用之間的重載解析
考慮以下函數重載:
int f( int ); int f( int && ); int f( int const & );
呼叫int q = f( 3 );是不明確的,因為所有三個重載對於該參數都是可行的。重載解析規則規定,必須有一個參數初始化優於其他兩個參數。
在這種情況下,參數初始化為:
但是,這些初始化都不比其他兩個好。因此,該調用是不明確的。
刪除 f( int ) 會導致 Clang 和 GCC 偏好右值引用 (int&&) 而不是左值引用 (int const&)。這是因為右值引用可以綁定到右值 3,而左值引用則不能。刪除任一引用重載都會導致 f( int ) 產生歧義。
此行為是由於 int 等效於 int&& 和 int const& 的事實。但是,int&& 和 int const& 並不等同。在它們之間進行選擇的規則是,當兩者都是引用綁定且 int&& 綁定到右值而 int const& 綁定到左值時,int&& 優於 int const&。
當其中一個初始化為不是參考綁定。因此,int 與 int&& 和 int const& 沒有區別。
在未來的標準中 int&& 不可能比 int 更受青睞。提議的規則將使引用綁定比非引用綁定更好的匹配,這將違反現有的重載解析規則。
以上是C 重載解析如何處理 `int`、`int&&` 和 `const int&`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!