内置类型的析构函数(int、char 等)
Posted
技术标签:
【中文标题】内置类型的析构函数(int、char 等)【英文标题】:Destructors of builtin types (int, char etc..) 【发布时间】:2010-10-02 03:53:09 【问题描述】:在 C++ 中,以下代码给出编译器错误:
void destruct1 (int * item)
item->~int();
这段代码几乎相同,我只是将 int 类型定义为另一种类型,然后神奇的事情发生了:
typedef int myint;
void destruct2 (myint * item)
item->~myint();
为什么第二个代码有效?一个 int 是否仅仅因为它已被类型定义而得到一个析构函数?
如果您想知道为什么有人愿意这样做:这来自重构 C++ 代码。我们正在删除标准堆并用自制池替换它。这需要我们调用placement-new 和析构函数。我知道为原始类型调用析构函数是没有用的,但我们仍然希望在代码中使用它们,以防我们以后用真正的类替换 POD。
发现裸 int 不起作用但 typedefed 起作用,真是令人惊讶。
顺便说一句 - 我有一个涉及模板功能的解决方案。我们只是在模板中输入定义,一切都很好。
【问题讨论】:
***.com/a/24000744/11862989 也检查一下这个 【参考方案1】:这就是使您的代码适用于泛型参数的原因。考虑一个容器 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-name 是。在7.1.5.2
中查找。
【讨论】:
我认为这就是 std::is_destructible 在旧编译器(2012-2014)中如此不一致的原因 这是关于int
不是类型名称的最后一句话的链接:[dcl.type.simple]。
@JohannesSchaub-litb item->~myint();
这行究竟做了什么,或者它相当于;
空白语句?以上是关于内置类型的析构函数(int、char 等)的主要内容,如果未能解决你的问题,请参考以下文章