1

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

auto obj = MyClass()

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

选项1:直接调用方法

obj.method()

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

std::move(obj).method()

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

4

1 回答 1

1

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

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

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

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

于 2019-12-15T07:34:18.207 回答