2012-01-24 98 views
4

可能重複:
Destructors of builtin types (int, char etc..)爲什麼這個模板函數能夠成功編譯?

模板函數:

template<typename T> void kill(T* type) 
{ 
    type->~T(); 
} 

電話:

int x= 5; 
kill(&x); 

哇,它編譯!?像int這樣的原始類型如何具有析構函數?它也與char工作,bool

+0

'destroy'或'kill'? – sblom

+0

殺!!!我是一個殺人狂。 – ApprenticeHacker

+0

好的 - 將上面的'destroy'改爲'kill'。 – sblom

回答

4

標準的§12.4.16說

16 [注:析構函數的顯式調用符號可用於任何 標量類型名( 5.2.4)。允許這樣就可以編寫代碼而不必知道給定類型是否存在析構函數。例如,

typedef int I; 
I* p; 
p->I::~I(); 

末端音符]

+0

因此編譯器會忽略對標量類型的析構函數的任何調用? – ApprenticeHacker

+0

@IntermediateHacker是否特意忽略它們,或只是看到它們什麼都不做,並且將它們從代碼中排除,效果是一樣的。這是一個功能,可能是爲了更容易編寫模板而設計的(儘管我只能猜測;我不知道在C++有模板之前,這個功能是否存在)。另外順便說一句,你的代碼展示未定義的行爲,因爲整數被兩次析構:) –

+0

@SethCarnegie:由於多個僞析構函數調用,沒有未定義的行爲。唯一的效果是在'.'或' - >'之前評估表達式。而且,對於同一個對象,多次調用瑣碎析構函數似乎沒有UB。 –

1

的標準的相關部分是§5.2.4/ 1:

後使用僞析構函數名的一個點。或arrow - >運算符表示由type-name命名的非類類型的析構函數。結果只能用作函數調用操作符()的操作數,並且此類調用的結果爲void類型。唯一的影響是在點或箭頭之前評估後綴表達式。

相關問題