首页 > 解决方案 > 我什么时候应该在 C++ 中将复制\移动构造函数标记为已删除?应该考虑哪些方面?

问题描述

我什么时候应该在 C++ 中将复制\移动构造函数标记为已删除?应该考虑哪些方面?当复制\移动构造函数既没有被删除也没有被用户定义的构造函数替换时,我应该注意什么潜在的问题?如果您能提供一些简单的示例,包括 libc++ 或 libstdc++ 提供的示例,我将不胜感激。

我想了又想,但还是没有完全理解。我将非常感激能在这个问题上得到一些帮助。

标签: c++

解决方案


如果复制与类型的设计意图不兼容,或者如果复制代表昂贵的操作或以其他方式影响类型的性能,则该类型应该是不可复制的。前者的明显情况是unique_ptr:一个唯一拥有特定资源的对象。如果您可以复制unique_ptr,那么您将拥有两个拥有该资源的对象。这将违反唯一拥有资源的意图,因此没有任何意义。

昂贵的操作将类似于std::mutex. 想要能够复制一个mutex. 但是,在许多实现中这样做会要求mutex堆分配(并使用共享引用)任何用于实现互斥锁的内部 OS 互斥锁数据结构。那是不必要的昂贵;不需要复制的用户mutex正在为这样做的能力付费。因此,相反,如果用户希望能够“复制互斥锁”,那么他们可以将其堆分配std::mutex并粘贴到shared_ptr.


推荐阅读