使用模板化运算符delete时,虚拟析构函数出现问题
Problem with virtual destructor when using templated operator delete
以下类(带有虚拟析构函数(包含模板化的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
仅从放置新表达式中选择使用。
推理基本上是";安全总比抱歉好";。如果模板可以在这些特殊情况下绑定,那么意外地声明一个你不想声明的特殊成员函数就太容易了。在复制构造函数的情况下,注意声明这样一个构造函数——就像你可以绑定到任何整数类型一样——如果它被算作复制构造函数,那么它会可怕地禁止类的移动构造。
当然,如果这真的是你想要的,你可以声明非放置删除或复制构造函数,或者你拥有的东西,并将其委托给模板。因此,这里的设计提供了安全性,而不会过度约束您。
相关文章:
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 程序永远不会进入虚拟析构函数
- C++ std::vector 中的虚拟析构函数继承
- 哪种方法更适合处理虚拟析构函数?
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 带有未解析外部元素的C++虚拟析构函数
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++切片和虚拟析构函数
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 添加虚拟析构函数会使代码大小膨胀
- 应该是虚拟析构函数吗?但是怎么做呢?
- 虚拟析构函数将对象移出 rodata 部分
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用
- DIRECTX9 中自定义顶点的虚拟析构函数
- 为什么缺少虚拟析构函数不会导致内存泄漏?
- std::unique_ptr 在虚拟析构函数上重置 SIGABRT
- C++11 中默认纯虚拟析构函数的正确放置
- 在派生类中重写哪个基类的虚拟析构函数