值、右值引用、常量左值引用之间的重载解析
考虑以下函数重载:
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中文网其他相关文章!