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



我看到了这个:问题

但是对于像我这样的C++新手来说,那里的答案非常复杂。如果有人能帮助我,我希望它。

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

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

首先,复制赋值运算符通常使用"const CLASSA &"作为参数,而不是简单的"CLASSA"。

通常,移动有两种用例:

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

最新更新