gpt4 book ai didi

c++ - 为什么析构函数会禁用隐式 move 方法的生成?

转载 作者:IT老高 更新时间:2023-10-28 22:18:37 25 4
gpt4 key购买 nike

我试图通过阅读 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 的上述文字在我的脑海中引发了一些问题:

  • 为什么声明析构函数会隐藏 move 语义?
  • 是否声明/定义析构函数只隐藏 move 语义或复制构造函数和复制赋值也隐藏了 move 语义?

最佳答案

“零规则”实际上是关于生成什么特殊成员函数以及何时生成的其他内容。这是关于对类(class)设计的某种态度。它鼓励您回答问题:

我的类(class)是否管理资源?

如果是这样,则应将每个资源移至其专用类,以便您的类仅管理资源(不做任何其他事情)或仅累积其他类和/或执行相同的逻辑任务(但不管理资源)。

这是更一般的单一职责原则的特例

当您应用它时,您会立即看到,对于资源管理类,您必须手动定义 move 构造函数、 move 赋值和析构函数(很少需要复制操作)。对于非资源类,您不需要(实际上您可能不应该)声明以下任何一项: move ctor/assignment、复制 ctor/assignment、析构函数。

因此名称中的“零”:当您将类与资源管理和其他分开时,在“其他”中您需要提供零特殊成员函数(它们将正确自动生成。

C++ 中有一些规则(特殊成员函数的)定义会抑制其他定义,但它们只会分散您对零规则核心的理解。

有关详细信息,请参阅:

  1. https://akrzemi1.wordpress.com/2015/09/08/special-member-functions/
  2. https://akrzemi1.wordpress.com/2015/09/11/declaring-the-move-constructor/

关于c++ - 为什么析构函数会禁用隐式 move 方法的生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33932824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com