以下是一个示例代码,显示了用户定义转换为右值引用的重载解析的不同行为:
#include
#include
using namespace std;
class A {
public:
A() {}
A(int val) {
this->val = val;
}
int getVal() const {
return val;
}
private:
int val;
};
class B {
public:
B(A&& a) {
this->val = a.getVal();
}
B(int val) {
this->val = val;
}
int getVal() const {
return val;
}
private:
int val;
};
int main() {
A a = 1;
B b1 = a; // 不是右值引用
B b2 = static_cast(a); // 是右值引用
cout << b1.getVal() << endl; // 输出为 0
cout << b2.getVal() << endl; // 输出为 1
return 0;
}
在这个示例中,当我们将一个类型为A的对象传递给类型为B的构造函数时,它不是右值引用。因此,编译器会选择匹配类型为“A”的构造函数。这将导致b1的值为0。
然而,如果我们使用C++11的右值引用语法将对象传递给类型为B的构造函数,编译器会选择匹配类型为“A&&”的构造函数。这将导致b2的值为1。
因此,我们可以使用C++11的右值引用语法来确保正确的重载解析。