如何根据对象是否为右值引用路由到不同的实现?

How to route to different implementations according to whether an object is a rvalue reference or not?

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

auto obj = MyClass()

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

方式一:直接调用方法

obj.method()

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

std::move(obj).method()

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

您可以使用 reference qualifiers 声明成员函数。例如

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

Is there a way to route/overload the method according to whether an object is a rvalue reference or not?

准确的说,重载决策选择哪种重载取决于被调用的对象是左值还是右值,而不是它的类型是不是右值引用。类型和 value categories 是两个独立的东西。