如何解决应该永远不要使用用户定义的空析构函数吗?
struct A1
{
~A1() {} // A1 is not trivially destructible
};
struct A2
{
~A2() = default; // A2 is trivially destructible
};
A2
比 A1
好,因为 A2
是微不足道的,而 A1
不是。
我想也许我们可以放心地说:
我说得对吗?
解决方法
您可以在示例中看到这种空析构函数的用例。您可以使用它来强制平凡类型变得非平凡。这是一个极不可能的用例。但我完全没有信心说它永远没有用。
不过,您离目标不远了。在 C++ 编程的十年里,我每天都看到很多空的析构函数,但没有一个不能用 =default
替换或完全省略。
不过,我对机械更换持谨慎态度。所以:
-
几乎不应该使用用户定义的空析构函数。
-
几乎每个用户定义的空析构函数都应该完全省略(首选选项)或替换为默认的析构函数。
在头文件中:
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 举报,一经查实,本站将立刻删除。