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

C++对象析构函数多种调用方式的标准合规性咨询

C++标准对三种析构调用写法的合法性判定

根据现行C++标准的语法与语义约束,上述#1、#2、#3三种写法全部不属于标准合法写法,均为对应编译器的非标准扩展或实现缺陷,具体分析如下:

  • 对于 x.~int();(#1 仅MSVC支持)
    标准[expr.prim.id.dtor]章节明确规定,析构函数标识的语法为 ~ 后接*类型名(type-name)*或decltype说明符。int属于简单类型说明符,不属于通过using/typedef定义的类型名,也不是decltype说明符,不符合语法要求,属于MSVC的自定义扩展。
  • 对于 x.~auto();(#2 仅GCC支持)
    auto作为占位类型说明符,标准未允许其出现在析构标识的~符号之后,该写法是GCC私有的非标准扩展,目前没有对应的标准化提案支撑。
  • 对于 x.~decltype(x)();(#3 仅Clang和MSVC支持)
    即使C++20之后允许decltype说明符出现在~之后,该写法仍然不符合标准语义约束:伪析构调用要求~后的类型必须是与调用对象类型匹配的类型别名,直接使用decltype(x)不符合伪析构调用的名字查找规则,属于编译器的实现偏差。

仅x.~T()的写法完全符合标准要求:T是int的类型别名,属于合法的type-name,符合伪析构调用的所有约束,因此可在所有合规编译器上正常编译。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:57:00