[英]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)
使用接受A
的B
的构造函数创建一个临时(右值) 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.