c++ - 调用C++对象析构函数的各种方式
问题描述
可以使用析构函数调用语法显式破坏 C++ 对象(对于伪破坏的非类类型)。但看起来除了普遍接受的语法外,几乎所有现代编译器都支持自己的调用析构函数的方式:
using T = int;
const int x = 1;
int main() {
x.~T(); //ok everywhere
x.~int(); //#1: ok in MSVC only
x.~auto(); //#2: ok in GCC only
x.~decltype(x)(); //#3: ok in Clang and MSVC only
}
除了x.~T()
适用于所有编译器的 ,还有至少 3 个其他选项,演示:https ://gcc.godbolt.org/z/895bd9T5c
根据标准,选项#1、#2 或#3 中的任何一个是否合法,或者它们都只是相应编译器的扩展/错误?
解决方案
语法不允许(1)和(2),所以这些是非法的。
(参见[expr.prim.id.dtor]
-> id-expression -> unqualified-id -> type-name。)
虽然语法确实允许 (3) (... -> unqualified-id -> decltype-specifier ),但我没有看到任何[expr.prim.id.dtor]
不允许decltype
在这种情况下使用的内容。
我尝试了几种不同的方法(创建T
类类型、创建x
依赖等),并且在所有情况下 GCC 都拒绝了~decltype(...)
. 我假设这是一个 GCC 错误。
推荐阅读
- bokeh - Bokeh RuntimeError: 模型必须只属于一个文档,Selection(id='1057', ...) 已经在一个文档中
- php - 计算每个值在列中出现的次数
- python - 如何在 Python 中找到满足条件(最大和最小阈值)的所有可能组合?
- php - 获取 `POST 请求需要一个 Content-length 标头。' 运行 Curl 代码时
- multithreading - Google Cloud Platform / Amazon Web Services 虚拟内核上的多线程
- java - 是否可以将 count(*) 和 groupBy 添加到 Spring Data Jpa 规范?
- avplayer - 有些视频需要很长时间才能使用 AVPlay 播放
- java - 有没有办法从 io.swagger.models.Swagger 获取 swagger ui html?
- cplex - 如何在每个节点上对所有非整数变量进行分支?
- ios - 如何将多个数据写入firebase?