内buildtypes的析构函数(int,char等)
在C ++中,下面的代码给出了一个编译器错误:
void destruct1 (int * item) { item->~int(); }
这个代码几乎是一样的,我只是键入int到另一个types,并发生了一些奇迹:
typedef int myint; void destruct2 (myint * item) { item->~myint(); }
为什么第二个代码有效? 一个int得到一个析构函数是因为它已被typedefed?
如果你想知道为什么有人想这样做:这是来自重构C ++代码。 我们正在删除标准堆,并用自制池replace它。 这要求我们调用placement-new和析构函数。 我知道为基元types调用析构函数是没用的,但是我们希望它们在代码中,以防我们用实际的类来replacePOD。
发现赤裸裸的int不工作,但typedefed的做是一个惊喜。
顺便说一句 – 我有一个涉及模板function的解决scheme。 我们只需在模板中inputdef,一切都很好。
这是使你的代码适用于通用参数的原因。 考虑一个容器C:
template<typename T> struct C { // ... ~C() { for(size_t i = 0; i<elements; i++) buffer[i].~T(); } };
引入内置types的特殊情况会很麻烦。 因此,即使T碰巧等于int
,C ++也允许你做到上面的事情。 神圣的标准在12.4 p15
说:
显式调用析构函数的符号可用于任何标量types名称。 允许这样就可以编写代码而不必知道给定types是否存在析构函数。
使用plain int和typedef'ed int的区别在于它们在语法上是不同的。 规则是,在析构函数调用中, ~
之后的是一个types名称。 int
不是这样的,但是typedef-name是。 在7.1.5.2
查找它。