c++ - 调用一个平凡的析构函数有什么影响?

标签 c++ language-lawyer destructor lifetime

调用一个简单的析构函数会结束一个对象的生命周期吗?
我读了 thisthis但没有找到很好的解释。这些线程声明一个简单的析构函数调用没有效果,代码如 struct A { int x; } a; a.~A(); a.~A();是合法的。
但我在标准中发现了这个例子:

struct C { };
void f() {
    C * pc = new C;
    using C2 = C;
    pc->C::~C2(); // OK, destroys *pc
    C().C::~C(); // undefined behavior: temporary of type C destroyed twice
    using T = int;
    0 .T::~T(); // OK, no effect
    0.T::~T(); // error: 0.T is a user-defined-floating-point-literal (5.13.8)
}

这里 C 具有简单的析构函数,但仍然对 C 类型的对象进行双重销毁具有未定义的行为?

最佳答案

从 C++20 开始,琐碎的析构函数调用结束了对象的生命周期。在此之前,他们没有,多次调用析构函数是有效的。

在 C++17(草案 N4659)中,在 [basic.life]/1.3 中明确排除了结束生命周期的琐碎析构函数并且具有平凡析构函数的对象将一直存在,直到它们的存储持续时间结束或它们的存储被重用( [basic.life]/1.4 )。

这随着 CWG issue 2256 的决议而改变在 this draft commit .

另请注意,伪析构函数调用也会结束 C++20 中的生命周期,但在此之前不会。您在问题中链接的两个问题都在谈论此类伪析构函数调用。请参阅 [diff.cpp17.basic]/1 中针对 C++17 的兼容性说明草案 (N4861)。

关于c++ - 调用一个平凡的析构函数有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61067402/

相关文章:

c++ - 将一维矩阵数组转换为主一维矩阵的有趣算法挑战,需要有效的解决方案

c++ - 对象指针数组的内存结构(可视化)

c++ - 关于简历分解的困惑

c++ - 为什么Clang和MSVC不喜欢带有多余括号的成员typedef声明?

c++ - 析构函数,返回临时对象

c++ - 我如何处理这种情况 C++ sizeof 问题

c++ - 如何在 C++ 头文件中定义字符串参数 - 与 Swift 桥接?

javascript - ES6 中 block 级函数的精确语义是什么?

c++ - 添加到 vector 后在析构函数内部双重释放

c++ - 是否有构造函数/析构函数方法的总称?