首页 >后端开发 >C++ >C 重载解析如何处理值、右值引用和常量左值引用参数?

C 重载解析如何处理值、右值引用和常量左值引用参数?

DDD
DDD原创
2024-12-01 09:40:12346浏览

How Does C   Overload Resolution Handle Value, Rvalue Reference, and Const Lvalue Reference Parameters?

重载解析:值、右值引用和常量左值引用

在重载解析中,当多个函数调用时,遇到不明确的调用并不罕见。可行的函数共享相同的参数类型。当值、右值引用和 const 左值引用之间发生重载时,会出现一个特别有趣的情况。

歧义和解析

给定函数:

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

调用 int q = f( 3 );变得暧昧。当 f( int ) 被删除时,Clang 和 GCC 更喜欢右值引用而不是左值引用。但是,删除任一引用重载都会导致 f( int ) 出现歧义。

重载解析规则

重载解析基于为以下对象找到唯一的“更好匹配”参数。在没有特殊规则的情况下,所有三种初始化(值、右值引用和 const 左值引用)将无法区分。

但是,由于右值引用绑定到右值,而 const 左值引用则不绑定,因此由于 13.3.3.2 中的以下规则,右值引用被认为是更好的匹配:

S1 binds an rvalue reference to an rvalue and S2 binds an lvalue reference.

此规则不当一个初始化不是引用绑定时适用。

未来标准的提案

作者建议在未来标准中 int && 应该优先于 int,因为它强制与不受约束的对象类型不同,绑定到初始值设定项的初始化。这可以作为纯值传递的替代方案,同时避免移动的开销。

以上是C 重载解析如何处理值、右值引用和常量左值引用参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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