代码之家  ›  专栏  ›  技术社区  ›  Nils Pipenbrinck

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

  •  55
  • Nils Pipenbrinck  · 技术社区  · 16 年前

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

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

    这段代码几乎是相同的,我只是把int类型化为另一个类型,然后发生了一些神奇的事情:

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

    为什么第二个代码有效?一个int是否仅仅因为它被类型化而得到一个析构函数?

    如果你想知道为什么有人愿意这样做:这是因为重构C++代码。我们正在删除标准堆,并将其替换为自制池。这要求我们调用placement new和析构函数。我知道为基元类型调用析构函数是没用的,但是我们希望在代码中使用它们,以防以后我们用真正的类替换pods。

    发现NakedInt不起作用,但typefed却起作用,真让人吃惊。

    顺便说一句,我有一个涉及模板函数的解决方案。我们只是在模板中typedef,一切都很好。

    1 回复  |  直到 14 年前
        1
  •  86
  •   Johannes Schaub - litb    16 年前

    这就是使代码适用于通用参数的原因。考虑容器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'ed int的区别在于它们在语法上是不同的。规则是,在析构函数调用中, ~ 是类型名。 int 不是这样,但typedef名称是。把它查进去 7.1.5.2 .