内置类型的析构函数(int,char等..)

时间:2009-01-19 01:43:36

标签: c++ constructor destructor typedef

在C ++中,以下代码给出了编译器错误:

void destruct1 (int * item)
{
  item->~int();
}

这段代码几乎相同,我只是将int解压缩到另一种类型,并发生了一些神奇的事情:

typedef int myint;

void destruct2 (myint * item)
{
  item->~myint();
}

为什么第二个代码有效? int是否因为已经被typedefed而得到析构函数?

如果您想知道为什么要这样做:这来自重构C ++代码。我们正在删除标准堆并将其替换为自制池。这要求我们调用placement-new和析构函数。我知道为原始类型调用析构函数是没用的,但我们希望它们在代码中,以防我们稍后用实际类替换POD。

发现赤裸裸的int不起作用,但是输入类型的东西确实令人惊讶。

顺便说一句 - 我有一个涉及模板功能的解决方案。我们只需在模板中输入dede,一切都很好。

1 个答案:

答案 0 :(得分:89)

这是使您的代码适用于通用参数的原因。考虑一个容器C:

template<typename T>
struct C {
    // ...
    ~C() {
        for(size_t i = 0; i<elements; i++)
            buffer[i].~T();
    }
};

引入内置类型的特殊情况会很烦人。因此C ++允许您执行上述操作,即使T恰好等于int。圣标在12.4 p15中说:

  

显式调用析构函数的表示法可用于任何标量类型名称。允许这样就可以编写代码而无需知道给定类型是否存在析构函数。

使用plain int和typedef'ed int之间的区别在于它们在语法上是不同的东西。规则是,在析构函数调用中,~之后的东西是类型名称。 int不是这样的,但是typedef-name是。在7.1.5.2中查找。