带虚析构函数的类使用模板化operator delete时的编译报错问题
模板化operator delete无法用于常规delete操作的原因
首先看你给出的类定义代码:
struct S { virtual ~S() {} template <typename... Args> void operator delete(void* ptr, Args... args); };
使用g++编译时会报错:
error: no suitable 'operator delete' for 'S'
问题解答
是的,用于常规delete操作的operator delete不能是模板。
C++标准明确规定,执行常规delete表达式(比如delete p;)时,编译器只会寻找非模板版的operator delete函数。模板化的operator delete不会被纳入常规delete操作的候选范围——哪怕模板的参数包可以推导为空也不行。
模板版本的operator delete是为带额外参数的delete场景设计的(比如配合放置new使用的delete(p, args...)),和常规无参数的delete操作是两个不同的重载匹配分支。
如果要让类S支持常规delete操作,必须额外提供一个非模板的operator delete重载,示例如下:
struct S { virtual ~S() {} // 适配常规delete的非模板版本 void operator delete(void* ptr) { // 这里可以自定义内存释放逻辑,或者调用全局delete ::operator delete(ptr); } // 模板版本用于带额外参数的delete场景 template <typename... Args> void operator delete(void* ptr, Args... args); };
内容的提问来源于stack exchange,提问作者Blackteahamburger
相关产品推荐
相关产品推荐

