c++ - 我什么时候应该在 C++ 中将复制\移动构造函数标记为已删除?应该考虑哪些方面?
问题描述
我什么时候应该在 C++ 中将复制\移动构造函数标记为已删除?应该考虑哪些方面?当复制\移动构造函数既没有被删除也没有被用户定义的构造函数替换时,我应该注意什么潜在的问题?如果您能提供一些简单的示例,包括 libc++ 或 libstdc++ 提供的示例,我将不胜感激。
我想了又想,但还是没有完全理解。我将非常感激能在这个问题上得到一些帮助。
解决方案
如果复制与类型的设计意图不兼容,或者如果复制代表昂贵的操作或以其他方式影响类型的性能,则该类型应该是不可复制的。前者的明显情况是unique_ptr
:一个唯一拥有特定资源的对象。如果您可以复制unique_ptr
,那么您将拥有两个拥有该资源的对象。这将违反唯一拥有资源的意图,因此没有任何意义。
昂贵的操作将类似于std::mutex
. 想要能够复制一个mutex
. 但是,在许多实现中这样做会要求mutex
堆分配(并使用共享引用)任何用于实现互斥锁的内部 OS 互斥锁数据结构。那是不必要的昂贵;不需要复制的用户mutex
正在为这样做的能力付费。因此,相反,如果用户希望能够“复制互斥锁”,那么他们可以将其堆分配std::mutex
并粘贴到shared_ptr
.
推荐阅读
- github - nulInCommit: NUL byte in the commit object body
- gcc - 制作依赖关系:使用 gcc 跳过供应商和包头?
- php - 获取帖子作者图片 - Wordpress
- java - 如果不是以管理员身份运行,cmd 无法识别 Java 命令
- summary - BlueSKy 摘要数值统计分析
- javascript - 使用矩js计算数组中所有对象的所有持续时间的总和
- android - 如何在 ScrollView 上显示滚动条?
- bash - 链码参数错误:JSON 输入意外结束
- c# - 我如何处理 C# 中的 Ping 异常
- github - GraphQL | 我们可以使用指令在 GitHub GraphQL API 中通过编程语言实现搜索吗?