将原始指针移动后将其设置为null意味着该指针代表所有权。但是,许多指针用于表示关系。而且,很长一段时间以来,建议所有权关系的表示方式与使用原始指针的方式不同。例如,您所指的所有权关系由表示std::unique_ptr<T>
。如果您希望隐式生成的移动操作照顾您的所有权,那么您所要做的就是使用实际上代表(并实现)所需所有权行为的成员。
同样,生成的移动操作的行为与复制操作的行为是一致的:它们也没有做任何所有权假设,例如,如果复制了指针,则不会进行深层复制。如果您希望这种情况发生,还需要创建一个编码相关语义的合适的类。
我刚刚记得读过一篇论文,上面写着“移动绝不应该比复制昂贵”或类似的东西。将原始指针设置为null将破坏该规则。您知道我在谈论哪篇论文,还是我的大脑弥补了这一缺陷?
我对第一句话“移动原始指针后将其设置为null表示该指针表示所有权”并不完全满意。这是为什么?我不同意。在现代代码库中,堆所有权由智能指针处理。原始指针仅等同于引用,只是开发人员可以选择引用“无”。在旧的代码库中,您不知道指针是用于拥有堆还是仅引用某对象。因此,将指针设置为空恕我直言并不意味着拥有它。