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

标签 c++ c++11

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

Alternatively to prevent slicing as per C.67, the copy and move operations can all be deleted

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

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

最佳答案

这完全取决于您的用例:

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

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

关于c++ - 我什么时候会在基类中默认(而不是删除)复制和移动操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52597074/

相关文章:

c++ - 将基于 C++11 范围的 for 循环与右值 range-init 一起使用是否安全?

c++ - OpenCV:自定义区域/图像作为 GrabCut 的 "background"的来源

c++ - 对象 vector - 如何向构造函数发送参数?

c++ - 在 C++20 中 std::vector 运算符 == 对具有不同分配器的 vector 不起作用有什么原因吗?

c++ - 重构具有不同参数的独特函数

c++ - 动态对象的统一初始化

c++ - (伪)-行列式为零的 N×N 矩阵的逆

c++ - move 从 istream 派生的类

c++ - 共享指针仅通过 std::shared_ptr 初始化。 std::make_shared 构造函数不工作

c++ - 编译器如何从Deleted-default-ctor lambda生成闭包?