c++ - 如何根据对象是否为右值引用路由到不同的实现?
问题描述
例如,我有一个名为的类MyClass
并从中创建一个实例:
auto obj = MyClass()
我有两种方法来调用它的方法。
选项1:直接调用方法
obj.method()
选项2:obj
先转换为右值引用,然后调用方法
std::move(obj).method()
我想知道是否可以method
在选项 1 和选项 2 之间创建不同的实现。有没有办法根据对象是否是右值引用来路由/重载方法?
解决方案
您可以使用引用限定符声明成员函数。例如
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
有没有办法根据对象是否是右值引用来路由/重载方法?
准确地说,在重载决议中选择哪种重载取决于要调用的对象是左值还是右值,而不是其类型是否为右值引用。类型和值类别是两个独立的东西。
推荐阅读
- parallel-processing - All to All 广播实现和 MPI
- javascript - 当我将 EmailJS CDN 添加到我的 HTML 代码时,预加载器不会关闭
- webpack - webpack 需要上下文第二个回调做什么
- heroku - 如何解决在 Heroku 中安装 NLTK 包时出错
- javascript - 如何在单击按钮时隐藏和显示来自循环的部分 - Angular 8
- javascript - 检查firebase中的活动订单数
- c++ - 将 char 推入堆栈不起作用
- python - 未找到“后列表”的反向。'post-list' 不是有效的视图函数或模式名称
- python-3.x - 如何使用pdfminer3遍历一个目录下的多个PDF文件
- css - 我该如何解决这个“无效的属性值”问题?