我正在閱讀的STL代碼可能是舊的......但問題更多地與C++模板語法有關。C++ std :: destroy(T *指針)
的問題圍繞着這個STL模板函數:
template<class T> std::destroy(T *p) {
p->~T();
}
我似乎無法找到的std ::破壞(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()
如何工作?
我不知道爲什麼這是downvoted,這是一個合法的問題。 +1 – Rapptz
它被稱爲僞析構函數,並擁有自己的特殊規則。基本上,你只能使用* type-name *,它是一個類/枚舉名或typedef名。 – dyp
這是事實,你不能使用關鍵字來調用析構函數。 'typedef int INT; a->〜INT();'編譯。 – milleniumbug