2012-01-24 99 views
4

可能重复:
Destructors of builtin types (int, char etc..)为什么这个模板函数能够成功编译?

模板函数:

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

电话:

int x= 5; 
kill(&x); 

哇,它编译!?像int这样的原始类型如何具有析构函数?它也与char工作,bool

+0

'destroy'或'kill'? – sblom

+0

杀!!!我是一个杀人狂。 – ApprenticeHacker

+0

好的 - 将上面的'destroy'改为'kill'。 – sblom

回答

4

标准的§12.4.16说

16 [注:析构函数的显式调用符号可用于任何 标量类型名( 5.2.4)。允许这样就可以编写代码而不必知道给定类型是否存在析构函数。例如,

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

末端音符]

+0

因此编译器会忽略对标量类型的析构函数的任何调用? – ApprenticeHacker

+0

@IntermediateHacker是否特意忽略它们,或只是看到它们什么都不做,并且将它们从代码中排除,效果是一样的。这是一个功能,可能是为了更容易编写模板而设计的(尽管我只能猜测;我不知道在C++有模板之前,这个功能是否存在)。另外顺便说一句,你的代码展示未定义的行为,因为整数被两次析构:) –

+0

@SethCarnegie:由于多个伪析构函数调用,没有未定义的行为。唯一的效果是在'.'或' - >'之前评估表达式。而且,对于同一个对象,多次调用琐碎析构函数似乎没有UB。 –

1

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

后使用伪析构函数名的一个点。或arrow - >运算符表示由type-name命名的非类类型的析构函数。结果只能用作函数调用操作符()的操作数,并且此类调用的结果为void类型。唯一的影响是在点或箭头之前评估后缀表达式。

相关问题