【发布时间】:2020-12-27 01:04:21
【问题描述】:
C++20 引入了“销毁操作符删除”的概念,as described below:
delete-expressions 在调用 operator delete 之前不会执行 *p 的析构函数
所以,给定以下struct S:
struct S {
void operator delete(S* p, std::destroying_delete_t);
private:
~S();
};
我希望下面的 delete 不会插入对析构函数的调用,而只是调用我们提供的销毁运算符 delete
delete new S;
但是,GCC/Clang/MSVC 的行为不同:DEMO
只有 GCC 不会尝试访问 ~S(),其他人仍然需要访问 ~S()。
哪个是正确的?
【问题讨论】:
-
C++20 实现尚未完成,因此您应该在尝试依赖之前检查编译器声称支持的内容。
-
@NicolBolas 至少 cppreference 说这些编译器都支持它。
标签: c++ destructor delete-operator c++20