我什么时候会默认(而不是删除)基类中的复制和移动操作

When would I default (as opposed to delete) copy and move operations in a base class

本文关键字:基类 复制 操作 移动 删除 默认 什么时候      更新时间:2023-10-16

在 CppCoreGuidelines 项 C.21 中,此示例显示了在AbstractBase类中声明=default的复制/移动特殊函数。然后它继续说

或者,为了防止按照 C.67 进行切片,可以删除所有复制和移动操作

并提供了第二个示例,其中包含使用=delete声明的函数。

如果我有一个旨在作为继承层次结构中的基类的类,我是否应该始终使用第二个示例并删除复制/移动特殊函数以防止切片?如果它使类出现错误,我为什么要改用=default

这完全取决于您的用例:

切片是使用多态类时出错
  • 的常见原因,尤其是在代码大量使用多态基类时。然后很容易意外复制/移动/分配两个对象值,然后将它们当作基类进行处理。如果这是您的用例,那么您应该遵循建议。通常,这些类型的类最好通过(智能(指针使用,并且是克隆而不是复制的。

  • 如果你有一个抽象基类,但你打算在大多数情况下使用它的派生类,那么就没有必要以这种方式防止切片,因为出错的风险要小得多。