移动赋值运算符与复制赋值运算符

时间:2017-06-18 21:03:41

标签: c++

我看到了这个:question

但对于像我这样的C ++新手来说,那里的答案有点非常。如果有人可以帮助我的话,我希望如此。

CLASSA & operator=(CLASSA && other); //move assignment operator

CLASSA & operator=(CLASSA  other); //copy assignment operator

我仍然没有理解为什么我们需要这两个?他们基本上做同样的事情?那么有什么区别,你会在哪里使用另一个?

1 个答案:

答案 0 :(得分:1)

首先,复制赋值运算符通常使用“const CLASSA&”作为参数,而不仅仅是“CLASSA”。

通常,移动有两种用例:

  1. 优化:副本价格昂贵,但移动便宜。例如,使用std :: string的典型实现,可以便宜地移动它。复制更昂贵(内存分配+复制)。例如,当std::vector<std::string>需要增长时,可以使用移动。在过去(当没有rval ref存在时),std::vector<std::string> grow实现如下:分配一个新的更大的区域,然后复制(慢)字符串到新的位置,然后销毁字符串在旧地方。现在,有了rval refs,就会发生这种情况:分配一个新的更大的区域,然后移动(快速)字符串到新的位置。
  2. 设计禁止复制,但可以移动。例如,std :: unique_ptr