如何根据对象是否为右值引用路由到不同的实现?
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 是两个独立的东西。
例如,我有一个名为 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 是两个独立的东西。