调用一个简单的析构函数会结束一个对象的生命周期吗?
我读了 this和 this但没有找到很好的解释。这些线程声明一个简单的析构函数调用没有效果,代码如 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/