C ++中值语义和移动语义之间的联系是什么?

时间:2018-05-06 11:07:32

标签: c++ c++11 move-semantics

有很多文章讨论价值语义与参考语义,也许更多的文章试图解释移动语义。但是,没有人谈论过值语义和移动语义之间的连接。它们是正交概念吗?

注意:这个问题不是关于比较值语义和移动语义,因为很明显这两个概念不是“可比的”。这个问题是关于他们是如何联系的,特别是(如@StoryTeller所说),讨论(如何):

  

移动语义有助于更多地使用值类型。

1 个答案:

答案 0 :(得分:6)

来自original move proposal

  

复制与移动

     

C和C ++建立在复制语义上。这是一件好事。移动   语义不是试图取代复制语义,也不是破坏   它以任何方式。相反,该提议旨在增强复制语义。一个   一般用户定义的类可以是可复制的和可移动的,一个或   另一个,或两者都没有。

     

副本和移动之间的区别在于副本离开了   来源不变。另一方面,一个移动使源在一个   状态为每种类型定义不同。来源的状态可能   不变,或者可能完全不同。唯一的要求   是对象保持自我一致状态(所有内部   不变量仍然完好无损)。从客户端代码的角度来看,   选择移动而不是复制意味着你不关心发生了什么   到源的状态。

     

对于POD,移动和复制是相同的操作(直到   机器指令级别。)

我想可以添加一个并说:

移动语义允许我们保持值语义,但同时在原始(复制自)对象的值对程序逻辑不重要的情况下获得引用语义的性能。