内建类型的析构函数(INT,炭等。)
-
19-08-2019 - |
题
在C ++下面的代码给出了一个编译器错误:
void destruct1 (int * item)
{
item->~int();
}
此代码几乎是一样的,只是我的类型定义INT另一种类型,这样神奇的东西发生了:
typedef int myint;
void destruct2 (myint * item)
{
item->~myint();
}
为什么第二代码工作?难道一个int获取析构函数只是因为它已经通过typedef?
如果你想知道为什么人会想做到这一点:这是来自重构的C ++代码。因此我们将移除标准堆,并与自制池替换它。这就要求我们在呼叫部署新和析构函数。我知道,调用析构函数的基本类型是没用的,但我们希望他们在代码仍须情况下,我们后来与真正的类代替荚。
找出那个裸体INT的不工作,但通过typedef的人都相当惊讶。
顺便说一句 - 我有涉及模板函数的溶液。我们刚刚的typedef在模板中,一切都很好。
解决方案
这是使您的代码工作泛型参数的原因。考虑一个容器C:
template<typename T>
struct C {
// ...
~C() {
for(size_t i = 0; i<elements; i++)
buffer[i].~T();
}
};
这将是恼人的引进特殊情况下为内置类型。所以C ++允许你做以上,甚至如果T恰好等于int
。圣标准说,在12.4 p15
:
有一个析构函数的明确的呼叫的符号可用于任何标量类型名称。允许这使得它可以编写代码,而不必知道,如果一个析构函数存在一个给定的类型。
使用纯int和一个Typedef的INT之间的区别是,它们在语法上不同的事情。规则是,在析构函数调用,~
后的事情是一个类型名。 int
是不是这样的事情,而是一个typedef名是。在7.1.5.2
查找。
不隶属于 StackOverflow