首页 > 后端开发 > C++ > 为什么 C 中的 `int`、`int&&` 和 `const int&` 之间的重载解析不明确?

为什么 C 中的 `int`、`int&&` 和 `const int&` 之间的重载解析不明确?

DDD
发布: 2024-11-28 15:58:10
原创
760 人浏览过

Why is Overload Resolution Ambiguous Between `int`, `int&&`, and `const int&` in C  ?

存在值、右值引用和常量左值引用重载时的重载解析歧义

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板