2011-07-23 34 views
20

所以我一直在尋找通過一些刺激源代碼和跨越這來了:爲什麼boost :: checked_delete「故意複雜」?

(從<boost/checked_delete.hpp>

template<class T> inline void checked_delete(T * x) 
{ 
    // intentionally complex - simplification causes regressions 
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; 
    (void) sizeof(type_must_be_complete); 
    delete x; 
} 

任何人碰巧知道爲什麼以這種方式實現的? size(T)(例如)已經足夠了嗎?

+0

好問題:) –

回答

20

Someone asked the same question earlier。本帖由Peter Dimov擁有(的boost/checked_delete.hppone of the writers)編寫的幾乎不言自明:

  • 什麼是應用的sizeof不完全類型的結果?

編譯時錯誤,除非編譯器選擇返回0作爲 非標準擴展。

  • 爲什麼sizeof被調用兩次?

第二的sizeof是用於 一個Metrowerks CodeWarrior開發錯誤,這除非所使用的第一的typeof從不實例一種解決方法。

  • 爲什麼sizeof轉換的結果無效? 行 是做什麼的?

靜音編譯器警告。

+0

Doh!擊敗我的心靈力量一分鐘!仍然很高興知道我的猜測是相當準確的:-) – Praetorian

+0

@Praetorian:我對'sizeof(T)有同樣的懷疑? 1:-1「的表達,但我想直接從(其中一個)作者自己得到它。 :-) –

+2

非常好,做得很好。 –

3

這只是一個猜測;但是當編寫sizeof(incomplete_type)並返回0時,可能會有編譯器發出警告。所以你要確保數組聲明在這種情況下失敗,試圖聲明一個大小爲-1的數組。

相關問題