考虑以下代码:
#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]确实暗示标量析构函数的存在
使用一个伪析构函数名称在一个点之后.
或箭头->
操作员
表示由以下名称命名的非类类型的析构函数类型名称.
然而,这与标准的其他部分不一致,例如§12,它将析构函数称为特殊成员函数并提到
析构函数用于销毁其类类型的对象。
这似乎是 C++98 天内产生的不精确性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)