可能重复:
Destructors of builtin types (int, char etc..)为什么这个模板函数能够成功编译?
模板函数:
template<typename T> void kill(T* type)
{
type->~T();
}
电话:
int x= 5;
kill(&x);
哇,它编译!?像int
这样的原始类型如何具有析构函数?它也与char
工作,bool
等
可能重复:
Destructors of builtin types (int, char etc..)为什么这个模板函数能够成功编译?
模板函数:
template<typename T> void kill(T* type)
{
type->~T();
}
电话:
int x= 5;
kill(&x);
哇,它编译!?像int
这样的原始类型如何具有析构函数?它也与char
工作,bool
等
标准的§12.4.16说
16 [注:析构函数的显式调用符号可用于任何 标量类型名( 5.2.4)。允许这样就可以编写代码而不必知道给定类型是否存在析构函数。例如,
typedef int I; I* p; p->I::~I();
末端音符]
因此编译器会忽略对标量类型的析构函数的任何调用? – ApprenticeHacker
@IntermediateHacker是否特意忽略它们,或只是看到它们什么都不做,并且将它们从代码中排除,效果是一样的。这是一个功能,可能是为了更容易编写模板而设计的(尽管我只能猜测;我不知道在C++有模板之前,这个功能是否存在)。另外顺便说一句,你的代码展示未定义的行为,因为整数被两次析构:) –
@SethCarnegie:由于多个伪析构函数调用,没有未定义的行为。唯一的效果是在'.'或' - >'之前评估表达式。而且,对于同一个对象,多次调用琐碎析构函数似乎没有UB。 –
的标准的相关部分是§5.2.4/ 1:
后使用伪析构函数名的一个点。或arrow - >运算符表示由type-name命名的非类类型的析构函数。结果只能用作函数调用操作符()的操作数,并且此类调用的结果为void类型。唯一的影响是在点或箭头之前评估后缀表达式。
'destroy'或'kill'? – sblom
杀!!!我是一个杀人狂。 – ApprenticeHacker
好的 - 将上面的'destroy'改为'kill'。 – sblom