存在值、右值引用和常量左值引用重载时的重载解析歧义
在 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中文网其他相关文章!