2009-01-19 20 views
53

在C++下面的代码给出了一个编译器错误:析构函数内建类型(INT,焦炭等)

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

此代码几乎是一样的,我只是typedef的整型为另一种类型和一些魔术发生:

typedef int myint; 

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

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

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

发现赤裸的int不起作用,但是typedefed的做起来真是令人惊讶。

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

回答

77

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

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

这将是恼人的内置类型引入特殊情况。因此,即使T恰好等于int,C++也允许您执行上述操作。神圣的标准说,在12.4 p15

The notation for explicit call of a destructor can be used for any scalar type name. Allowing this makes it possible to write code without having to know if a destructor exists for a given type.

使用普通int和Typedef的INT之间的区别是,他们在语法上不同的东西。规则是,在析构函数调用中,~之后的东西是类型名称。 int是不是这样的事情,但typedef名称是。在7.1.5.2中查找它。

+13

+1“The Holy Standard”。 – ApprenticeHacker 2012-01-24 06:03:07