繁体   English   中英

右值引用和用户定义的转换

[英]rvalue references and user defined conversion

我试图弄清楚下面的代码中发生了什么(它的灵感来自shared_ptr(unique_ptr&&)构造函数)。

#include <iostream>
using namespace std;

class A {};

class B {
public:
    B(const A&) {
        cout << "ctor from A&\n";
    }
};

void f(B&&) { cout << "f(B&&)\n"; };
void f(const B&) { cout << "f(const B&)\n"; }

int main() {
    A a;
    f(a);
}

我试图了解它是如何工作的。 为什么右值是转换的结果并调用f(B&&)

function 不接受A类型的 object 。 但是,它确实接受B类型的 object ,并且A可以通过隐式转换构造函数转换为B 转换的结果是prvalue。 当参数是纯右值时,右值引用重载比 const 左值引用更匹配。

基本上,调用f(a)使用接受AB的构造函数创建一个临时(右值) B object 。 然后重载决议开始确定哪个f是更好的匹配。

此处适用的重载解决规则是over.match.best#over.ics.rank-3.2.3

S1 和 S2 包括引用绑定 ([dcl.init.ref]) 并且都不引用非静态成员 function 的隐式 object 参数,声明时没有引用限定符,并且 S1 将右值引用绑定到右值,S2 绑定左值参考

采用右值引用的重载优先于采用左值引用的重载。 (链接规则中有一个类似的例子)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM