例如,我有一个名为的类MyClass
并从中创建一个实例:
auto obj = MyClass()
我有两种方法来调用它的方法。
选项1:直接调用方法
obj.method()
选项2:obj
先转换为右值引用,然后调用方法
std::move(obj).method()
我想知道是否可以method
在选项 1 和选项 2 之间创建不同的实现。有没有办法根据对象是否是右值引用来路由/重载方法?
例如,我有一个名为的类MyClass
并从中创建一个实例:
auto obj = MyClass()
我有两种方法来调用它的方法。
选项1:直接调用方法
obj.method()
选项2:obj
先转换为右值引用,然后调用方法
std::move(obj).method()
我想知道是否可以method
在选项 1 和选项 2 之间创建不同的实现。有没有办法根据对象是否是右值引用来路由/重载方法?
您可以使用引用限定符声明成员函数。例如
class MyClass {
public:
void method() & { std::cout << "on lvalue\n"; }
void method() && { std::cout << "on rvalue\n"; }
};
然后
auto obj = MyClass();
obj.method(); // invoke the lvalue version
std::move(obj).method(); // invode the rvalue version
有没有办法根据对象是否是右值引用来路由/重载方法?
准确地说,在重载决议中选择哪种重载取决于要调用的对象是左值还是右值,而不是其类型是否为右值引用。类型和值类别是两个独立的东西。