【发布时间】:2013-07-19 21:23:11
【问题描述】:
我正在阅读的 STL 代码可能是旧的......但问题更多与 C++ 模板语法有关。
问题围绕着这个stl模板函数:
template<class T> std::destroy(T *p) {
p->~T();
}
我似乎找不到 std::destroy(T *) 函数的特化。所以在我看来,模板函数将为“int”类型实例化相同,并调用“int”的析构函数。为了说明我的观点,我创建了这个模拟 std::destroy 的示例代码。我把它叫做 my_destroy 在这个例子中。
#include <iostream>
#include <stdio.h>
using namespace std;
template <class T>
void my_destroy(T * pointer) {
pointer->~T();
}
int main()
{
int *a;
//a->~int(); // !!! This won't compile.
my_destroy<int>(a); // !!! This compiles and runs.
}
}
令我惊讶的是,这一行无法编译:
a->~int();
但这行编译:
my_destroy<int>(a);
我的困惑是,我认为 my_destroy<int>(a) 将被实例化为 a->~int(); 的等效项
对于一个更大的问题,当<int> 的STL 容器删除一个元素时,std::destroy() 是如何工作的?
【问题讨论】:
-
我不知道为什么这被否决了,这是一个合理的问题。 +1
-
它被称为伪析构函数,并且有自己的特殊规则。本质上,您只能使用 type-name,它可以是类/枚举名称或 typedef 名称。
-
事实上你不能使用关键字来表示调用析构函数。
typedef int INT; a->~INT();编译。 -
它被称为
std::destroy_at。