You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何含默认虚析构函数的类被判定为非平凡可析构?

为什么带默认虚析构函数的类不被视为平凡可析构?

先看这段会触发断言失败的代码:

#include <type_traits>

struct X
{
   virtual ~X() = default;
};

static_assert(std::is_trivially_destructible_v<X>); // 断言失败

引用cppreference的定义:

拥有平凡析构函数的对象无需delete表达式,仅释放其存储空间即可完成销毁

问题的核心在于C++标准对平凡析构函数的硬性规则:平凡析构函数要么是编译器自动生成的隐式析构,要么是被显式默认(= default)但同时类中不存在任何虚函数、也没有虚基类的析构函数。

只要你声明了虚析构——哪怕是用= default让编译器生成默认实现——这个析构函数就不再是平凡的:

  • 虚析构的调用逻辑依赖虚函数表,属于需要执行特定多态逻辑的函数,哪怕实际编译出的机器码可能只是调整虚表指针(甚至无额外操作),标准也不会将其归为平凡析构。
  • 平凡析构的核心要求是"不执行任何用户可见的操作",而虚析构的存在意味着对象销毁时必须遵循多态调用规则,这已经超出了"仅释放内存"的范畴。

你提到的"不调用虚析构也不会产生不良影响"是实际运行层面的观察,但std::is_trivially_destructible这类类型特性的判定严格遵循标准规则,而非看实际生成的代码是否有副作用。只要类中存在虚函数(包括虚析构),这个特性就会返回false。

内容的提问来源于stack exchange,提问作者Dmytro Ovdiienko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:02:35