代码之家  ›  专栏  ›  技术社区  ›  ToddR

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

  •  1
  • ToddR  · 技术社区  · 6 年前

    CppCoreGuidelines item C.21 , this 示例显示了正在声明的copy/move特殊函数 =default AbstractBase 班级。它接着说

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

    =delete

    如果我有一个类打算作为继承层次结构中的基类,我是否应该始终使用第二个示例并删除copy/move特殊函数以防止切片?我为什么要用 =默认值 相反,如果它使类容易出错呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Christophe    6 年前

    这完全取决于您的用例:

    • Slicing 是使用时常见的错误原因 polymorphic classes ,尤其是当您的代码大量使用多态基类时。然后很容易意外地复制/移动/分配两个对象值,然后将它们当作基类来处理。如果这是您的用例,那么您应该遵循建议。通常,这类类类最好通过(智能)指针使用,并且 cloned rather than copied .

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