Las*_*sie 4 c++ destructor lifetime language-lawyer
调用一个简单的析构函数会结束一个对象的生命周期吗?我读了这个和这个,但没有找到一个好的解释。这些线程声明一个简单的析构函数调用没有效果,并且类似的代码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)
}
Run Code Online (Sandbox Code Playgroud)
这里 C 具有简单的析构函数,但仍然对 C 类型的对象进行双重销毁具有未定义的行为?
从 C++20 开始,琐碎的析构函数调用结束了对象的生命周期。在此之前,他们没有,多次调用析构函数是有效的。
在 C++17(草案 N4659)中,平凡的析构函数被明确排除在[basic.life]/1.3的生命周期结束之外,而具有平凡析构函数的对象将继续存在,直到它们的存储持续时间结束或它们的存储被重用([basic.life] /1.4)。
另请注意,伪析构函数调用也会在 C++20 中结束生命周期,但在此之前不会。您在问题中链接的两个问题都在谈论此类伪析构函数调用。请参阅草案 (N4861) 的[diff.cpp17.basic]/1中针对 C++17 的兼容性说明。
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |