考虑以下代码:
#include <iostream>
typedef int t;
t a=42;
int main()
{
a.t::~t();
std::cout << a; //42
}
我预计这a
将被摧毁。但事实并非如此,为什么呢?那个伪析构函数调用将如何销毁对象?
考虑以下代码:
#include <iostream>
typedef int t;
t a=42;
int main()
{
a.t::~t();
std::cout << a; //42
}
我预计这a
将被摧毁。但事实并非如此,为什么呢?那个伪析构函数调用将如何销毁对象?
但事实并非如此,为什么呢?
§5.2.4/1:
唯一的影响是在点或箭头之前评估后缀表达式。
其中后缀表达式是发生调用的对象的表达式。因此,伪析构函数调用,作为对普通析构函数的调用,不会结束它所应用的对象的生命周期。例如,
int i = 0;
(i += 5).~decltype(i)();
std::cout << i;
您实际上不能为标量调用析构函数,因为它们没有析构函数(参见 [class.dtor])。该语句仅允许用于调用不知道类型的对象的析构函数的模板代码 - 它消除了为标量类型编写专门化的必要性。
在评论中指出,[expr.pseudo] 确实暗示了标量的析构函数的存在
在点或箭头运算符之后使用伪析构函数名称表示由type-name命名的非类类型的析构函数。
.
->
然而,这与标准的其他部分不一致,例如 §12,它将析构函数称为特殊成员函数并提到
析构函数用于销毁其类类型的对象。
这似乎是在 C++98 天创造的不精确性。