有很多文章讨论价值语义与参考语义,也许更多的文章试图解释移动语义。但是,没有人谈论过值语义和移动语义之间的连接。它们是正交概念吗?
注意:这个问题不是关于比较值语义和移动语义,因为很明显这两个概念不是“可比的”。这个问题是关于他们是如何联系的,特别是(如@StoryTeller所说),讨论(如何):
移动语义有助于更多地使用值类型。
答案 0 :(得分:6)
复制与移动
C和C ++建立在复制语义上。这是一件好事。移动 语义不是试图取代复制语义,也不是破坏 它以任何方式。相反,该提议旨在增强复制语义。一个 一般用户定义的类可以是可复制的和可移动的,一个或 另一个,或两者都没有。
副本和移动之间的区别在于副本离开了 来源不变。另一方面,一个移动使源在一个 状态为每种类型定义不同。来源的状态可能 不变,或者可能完全不同。唯一的要求 是对象保持自我一致状态(所有内部 不变量仍然完好无损)。从客户端代码的角度来看, 选择移动而不是复制意味着你不关心发生了什么 到源的状态。
对于POD,移动和复制是相同的操作(直到 机器指令级别。)
我想可以添加一个并说:
移动语义允许我们保持值语义,但同时在原始(复制自)对象的值对程序逻辑不重要的情况下获得引用语义的性能。