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