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



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

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

最佳答案

这完全取决于您的用例:

  • Slicing是使用polymorphic classes时常见的错误原因,尤其是在您的代码大量使用多态基类的情况下。这样很容易意外地复制/移动/分配两个对象值,然后将它们当作基类进行处理。如果这是您的用例,则应遵循建议。通常,此类类最好通过(智能)指针使用,它们为cloned rather than copied
  • 如果您有一个抽象基类,但您打算在大多数情况下使用其派生类,则无需以这种方式阻止 slice ,因为发生错误的风险要小得多。
  • 关于c++ - 我何时会默认(而不是删除)在基类中进行复制和移动操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52597074/

    10-16 19:06