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

为什么'int”、'int&&”和'const int&”之间的重载解析不明确?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-29 00:04:15802浏览

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

值、右值引用和常量左值引用之间的重载解析

考虑以下场景:

int f( int );
int f( int && );
int f( int const & );

int q = f( 3 );

调用 f(3) 结果在一个不明确的重载决策中。消除 f( int ) 会导致 Clang 和 GCC 优先考虑右值引用而不是左值引用。但是,删除任一引用重载都会导致 f( int ) 出现歧义。

重载解析规则

重载解析通常遵循严格的部分排序。然而,在这种情况下,int 似乎等同于两个并不等同的概念。管理这种情况的具体规则如下:

  • 相关参数的至少一个参数初始化必须比其他两个更好匹配。
  • 比较两个初始化时,要么一个比另一个好,要么都不好(它们无法区分)。
  • 如果没有直接引用绑定的特定规则,则此中的所有三个初始化
  • 直接引用绑定规则使 int && 比 const int & 更好匹配,但两者都不比 int 更好或更差。

特殊情况:引用绑定

C标准的13.3.3.2提供了一个特殊的规则可以直接参考绑定:

如果 S1S2 是引用绑定 (8.5.3),并且都不引用未声明的非静态成员函数的隐式对象参数ref-qualifier,并且 S1 将右值引用绑定到右值,并且S2 绑定左值引用,那么 S1S2 更好的匹配。

当其中一个初始化为不是引用绑定。

未来的考虑因素

进行引用的想法已经提出了比非引用绑定更好的匹配。要发起有关此主题的讨论,建议将此类提案发布到 ISO C 未来提案论坛。

以上是为什么'int”、'int&&”和'const int&”之间的重载解析不明确?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn