我一直在阅读C ++中关于移动语义的内容,并且在解释中人们提供了很多类比来帮助简化它,而在我的脑海中,我只能看到人们称之为"移动&# 34;而不是"复制"只是对象的浅层副本,并在"移动来自"中设置任何指针。对象为null。这基本上是要点吗?浅拷贝并将其他指针设置为null?
答案 0 :(得分:6)
浅拷贝并将其他指针设置为null?
浅拷贝 - 是的。将其他指针设置为null - 并非总是如此。
最低要求是移动的对象处于“未定义但有效的状态”,也就是说您可以重新分配它,再次移动它或删除它而不会导致程序失败,但执行no其他依赖国家的操作。这意味着在std::swap
。
某些对象定义了更强的合同。其中之一是std::unique_ptr
。移动其中一个将导致它包含null
,但这是明确记录的。
答案 1 :(得分:3)
移动语义只是一个浅表副本并将其他指针设置为null吗?
如果指针为null,则可以满足类不变量。也就是说:如果具有空指针的对象是有效状态。
所以,我会给出一个更长的描述:移动构造函数和赋值运算符执行浅复制,并将移动的对象清理为满足类不变量的状态。
还要记住,在移动分配的情况下,您必须记住处理将被吞下副本覆盖的指针。
例如,如果类拥有尖头对象,则不变量要求没有两个对象拥有相同的对象。至少有三种方法可以实现这一点:
如果不变量需要,有时还需要设置非size
字段或类似的非资源数据以匹配对象的新状态。除了拥有指向内存的指针(例如文件描述符)之外,对象可能还有其他资源,也必须清除它们。