我何时会默认(而不是删除)在基类中进行复制和移动操作

时间:2018-10-01 18:43:32

标签: c++ c++11

CppCoreGuidelines item C.21this示例中,显示了在=default类中声明为AbstractBase的复制/移动特殊功能。然后继续说

  

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

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

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

1 个答案:

答案 0 :(得分:1)

这完全取决于您的用例:

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

  • 如果您有一个抽象基类,但是您打算在大多数情况下使用其派生类,则无需以这种方式阻止切片,因为发生错误的风险要小得多。