为什么这个模板函数能够成功编译

Why exactly is this template function successfully compiling?

本文关键字:成功 编译 函数 为什么      更新时间:2023-10-16

可能重复:
内置类型(int、char等)的析构函数

模板功能:

template<typename T> void kill(T* type)
{
    type->~T();
}

呼叫:

int x= 5;
kill(&x);

哇,它编译了!?像int这样的基元类型怎么可能有析构函数?它也适用于charbool等。

标准§12.4.16规定

16[注意:析构函数显式调用的表示法可以用于任何标量类型name(5.2.4)。允许这样做可以编写代码,而不必知道给定类型的析构函数存在。例如,

typedef int I;
I* p;
p->I::~I();

--尾注]

标准的相关部分为§5.2.4/1:

在点后面使用伪析构函数名称。或箭头->运算符表示按类型名称命名的非类类型的析构函数。结果只能用作函数调用运算符()的操作数,并且此类调用的结果的类型为void。唯一的效果是对点或箭头之前的后缀表达式进行求值。