c++ - 为什么要为未删除的对象调用析构函数?
问题描述
struct A
{
~A() = delete;
};
int main()
{
new A{};
}
这无法编译并显示错误消息:
错误:使用已删除的函数 'A::~A()' new A{};
据我了解,我没有破坏该对象,那么它为什么要尝试调用析构函数?
使用 GCC 8.1.0 编译
g++ -std=c++17 -O2
解决方案
这是gcc 错误 57082。
让我们从下往上。
隐式或显式引用已删除函数(而不是声明它)的程序是格式错误的。
显然,我们没有~A()
明确提及。我们是否隐含地提到它?[class.dtor]/12:
隐式调用析构函数
- 对于在程序终止([basic.start.term])时具有静态存储持续时间([basic.stc.static])的构造对象,
- 对于在线程退出时具有线程存储持续时间([basic.stc.thread])的构造对象,
- 对于在其中创建对象的块退出([stmt.dcl])时具有自动存储持续时间([basic.stc.auto])的构造对象,
- 对于构造的临时对象,当其生命周期结束时([conv.rval],[class.temporary])。
或在[expr.new]/20中:
如果new 表达式创建了一个类类型的对象数组,则可能会调用析构函数。
我们有这些东西吗?不,这里没有具有自动、静态或线程存储持续时间的对象,也没有构造的临时对象,我们的new 表达式也没有创建数组。这里根本只有一个对象A
,我们正在聚合初始化的具有动态存储持续时间的对象。
由于我们既没有显式也没有隐式地引用~A()
,所以我们不能违反该规则。因此,gcc 错误。还要注意 gcc 接受new A;
and new A();
,就本规则而言,它们具有相同的含义。
推荐阅读
- powerbi - 汇总当前行的相对期间的收入,不适用于日期时间
- c++ - basic_streambuf
到 uint8_t* - r - R Shiny中2个小部件之间的空间
- reactjs - 如何通过调用 Redux、Sagas 和 Typescript 的操作来初始化 RootSagas
- flutter - 无法在颤动中返回菜单页面
- python - 如何从图像中提取图表?
- typescript - 什么数据结构适合存储模型
- sql - 为什么此日期转换会导致错误?
- spring - 无法从 Spring Boot 连接到 Dockerized MongoDb 实例
- twilio - 当通过 CDN 使用时,如何自定义 flex 网络聊天小部件上的颜色?