首页 > 解决方案 > 我什么时候会在基类中默认(而不是删除)复制和移动操作

问题描述

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

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

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

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

标签: c++c++11

解决方案


这完全取决于您的用例:

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

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


推荐阅读