繁体   English   中英

何时应在 C++ 中将复制\移动构造函数标记为已删除? 应该考虑哪些方面?

[英]When should I mark the copy\movement constructor as deleted in C++? What aspects should be considered?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM