微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

应该永远不要使用用户定义的空析构函数吗?

如何解决应该永远不要使用用户定义的空析构函数吗?

struct A1
{
    ~A1() {} // A1 is not trivially destructible
};

struct A2
{
    ~A2() = default; // A2 is trivially destructible
};

A2A1 好,因为 A2 是微不足道的,而 A1 不是。

我想也许我们可以放心地说:

1.永远不应使用用户定义的空析构函数

2.任何用户定义的空析构函数都应替换为认的析构函数

我说得对吗?

解决方法

您可以在示例中看到这种空析构函数的用例。您可以使用它来强制平凡类型变得非平凡。这是一个极不可能的用例。但我完全没有信心说它永远没有用。

不过,您离目标不远了。在 C++ 编程的十年里,我每天都看到很多空的析构函数,但没有一个不能用 =default 替换或完全省略。

不过,我对机械更换持谨慎态度。所以:

  1. 几乎不应该使用用户定义的空析构函数。

  2. 几乎每个用户定义的空析构函数都应该完全省略(首选选项)或替换为默认的析构函数。

,

在头文件中:

struct some_secret_type;
struct some_public_type {
  some_public_type();
  ~some_public_type();
private:
  std::unique_ptr<some_secret_type> pImpl;
};

然后,在cpp文件中:

#include <some_secret_type.h>

some_public_type::~some_public_type() = default;
some_public_type::~some_public_type() {};

这里我明确声明了一个析构函数,该析构函数最终要么是空的,要么是默认的。

此处 =default;{} 的效果在 cpp 文件中是相同的。

在头文件中,拥有 {}=default 将要求包含它的每个人都知道 some_secret_type 的样子。

在更一般的情况下,如果类型被轻微破坏,标头中的 {}=default 会发生变化。在 cpp/header 拆分中,它们没有。

标头中 {} 的优点是可以防止类型变得平凡(假设稍后您知道将使其变得不平凡,并且您不希望在以下情况发生其他行为更改你这样做)。

在 cpp 文件的情况下,{} 会保存几个字符。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。