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
相关产品推荐
相关产品推荐

