重载解析:值、右值引用和常量左值引用
在重载解析中,当多个函数调用时,遇到不明确的调用并不罕见。可行的函数共享相同的参数类型。当值、右值引用和 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中文网其他相关文章!