- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我试图通过阅读 this blog 来理解零规则的含义。 . IMO,它说如果你声明自己的析构函数,那么不要忘记将 move 构造函数和 move 赋值作为默认值。
Example :
class Widget {
public:
~Widget(); // temporary destructor
... // no copy or move functions
};
"The addition of the destructor has the side effect of disabling generation of the move functions, but because Widget is copyable, all the code that used to generate moves will now generate copies. In other words, adding a destructor to the class has caused presumably-efficient moves to be silently replaced with presumably-less-efficient copies".
Scott Meyers 的上述文字在我的脑海中引发了一些问题:
最佳答案
“零规则”实际上是关于生成什么特殊成员函数以及何时生成的其他内容。这是关于对类(class)设计的某种态度。它鼓励您回答问题:
我的类(class)是否管理资源?
如果是这样,则应将每个资源移至其专用类,以便您的类仅管理资源(不做任何其他事情)或仅累积其他类和/或执行相同的逻辑任务(但不管理资源)。
这是更一般的单一职责原则的特例。
当您应用它时,您会立即看到,对于资源管理类,您必须手动定义 move 构造函数、 move 赋值和析构函数(很少需要复制操作)。对于非资源类,您不需要(实际上您可能不应该)声明以下任何一项: move ctor/assignment、复制 ctor/assignment、析构函数。
因此名称中的“零”:当您将类与资源管理和其他分开时,在“其他”中您需要提供零特殊成员函数(它们将正确自动生成。
C++ 中有一些规则(特殊成员函数的)定义会抑制其他定义,但它们只会分散您对零规则核心的理解。
有关详细信息,请参阅:
关于c++ - 为什么析构函数会禁用隐式 move 方法的生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33932824/
我是一名优秀的程序员,十分优秀!