伪析构函数调用不会破坏对象

时间:2014-06-02 18:09:40

标签: c++ language-lawyer destructor primitive-types explicit-destructor-call

请考虑以下代码:

#include <iostream>

typedef int t;
t a=42;

int main()
{
    a.t::~t();
    std::cout << a; //42
}

我预计a将被销毁。但事实并非如此,为什么?伪析构函数调用将如何销毁该对象?

1 个答案:

答案 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天创建的一个不精确。