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

问题描述 投票:0回答:1

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

auto obj = MyClass()

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

选项1:直接调用方法

obj.method()

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

std::move(obj).method()

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

c++ c++11 overloading rvalue-reference stdmove
1个回答
1
投票

您可以使用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

是否有一种方法可以根据对象是否为右值引用来路由/重载该方法?

确切地说,在重载分辨率中选择哪个重载取决于要调用的对象是左值还是右值,而不是其类型是否是右值引用。类型和value categories是两个独立的事物。

© www.soinside.com 2019 - 2024. All rights reserved.