Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否需要始终为c+中的左/右值定义移动和复制+;?_C++ - Fatal编程技术网

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)以调用正确的移动分配。