首页 > 解决方案 > 如何根据对象是否为右值引用路由到不同的实现?

问题描述

例如,我有一个名为的类MyClass并从中创建一个实例:

auto obj = MyClass()

我有两种方法来调用它的方法。

选项1:直接调用方法

obj.method()

选项2:obj先转换为右值引用,然后调用方法

std::move(obj).method()

我想知道是否可以method在选项 1 和选项 2 之间创建不同的实现。有没有办法根据对象是否是右值引用来路由/重载方法?

标签: c++c++11overloadingrvalue-referencestdmove

解决方案


您可以使用引用限定符声明成员函数。例如

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

有没有办法根据对象是否是右值引用来路由/重载方法?

准确地说,在重载决议中选择哪种重载取决于要调用的对象是左值还是右值,而不是其类型是否为右值引用。类型和值类别是两个独立的东西。


推荐阅读