在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查找。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top