C++ 我是否需要始终为c+中的左/右值定义移动和复制+;?
我有一个带有某个实例变量C++ 我是否需要始终为c+中的左/右值定义移动和复制+;?,c++,C++,我有一个带有某个实例变量x的类,我想对该实例变量执行以下setter方法:当参数是左值时,该值复制到x,而如果参数是右值,则该值移动到x。以下是我所做的: class SomeClass { public: void setX(const Something& y) {x = y;} void setX(Something&& y) {x = y;} private: Something x; } 问题是:我是否总是像这样复制我的函数?如果我有
x
的类,我想对该实例变量执行以下setter方法:当参数是左值时,该值复制到x
,而如果参数是右值,则该值移动到x
。以下是我所做的:
class SomeClass {
public:
void setX(const Something& y) {x = y;}
void setX(Something&& y) {x = y;}
private:
Something x;
}
问题是:我是否总是像这样复制我的函数?如果我有3个参数,并且我想尽可能地移动,并且复制原始参数是左值,那么我将不得不考虑左/右值的各种组合。我应该如何避免这里的重复?为什么
setX
需要引用一个已经存在的值?大多数情况下,您可以按值获取参数,而不是按常量&
或和&
简单地将副本移动到参数中。如果你的周期如此重要,并且你确信你需要优化速度,你可以使用转发引用,使setX
成为一个template
,接受转发引用,然后std::forward
将其转发到x
。仅供参考,在void setX(Something&&y)
,y
本身是左值而不是右值,因此需要x=std::move(y)代码>以调用正确的移动分配。