使用模板化运算符delete时,虚拟析构函数出现问题

Problem with virtual destructor when using templated operator delete

本文关键字:虚拟 析构函数 问题 delete 运算符      更新时间:2024-09-21

以下类(带有虚拟析构函数(包含模板化的operator delete:

struct S
{
virtual ~S() {}
template <typename... Args>
void operator delete(void* ptr, Args... args);
};

args可以是空的,所以我认为S::operator delete也可以在预期通常的delete时使用。

然而(使用g++(,我得到一个错误:

错误:没有适合"S"的"操作员删除">

不能;合适的"操作员删除";是模板吗

不!与template<typename T> S(T const&)没有定义复制构造函数的原因大致相同。许多C++的特殊成员函数需要而不是作为模板。在这种情况下,模板化的operator delete仅从放置新表达式中选择使用。

推理基本上是";安全总比抱歉好";。如果模板可以在这些特殊情况下绑定,那么意外地声明一个你不想声明的特殊成员函数就太容易了。在复制构造函数的情况下,注意声明这样一个构造函数——就像你可以绑定到任何整数类型一样——如果它被算作复制构造函数,那么它会可怕地禁止类的移动构造。

当然,如果这真的是你想要的,你可以声明非放置删除或复制构造函数,或者你拥有的东西,并将其委托给模板。因此,这里的设计提供了安全性,而不会过度约束您。