2016-07-05 45 views
23

stl_construct.h具有以下功能時到void *:優勢鑄指針使用新

template<typename _T1, typename _T2> 
inline void 
_Construct(_T1* __p, const _T2& __value) 
{ 
    ::new(static_cast<void*>(__p)) _T1(__value); 
} 

我想知道爲什麼鑄造__pvoid*是必要的,它有什麼優勢?

+3

不確定,但它斷言'__p'是一個可用於放置的指針? –

+9

閱讀我遇到的內部庫代碼的危險是(新)程序員開始在自己的代碼中使用內部代碼(不,我不是在開玩笑 - 我在一些代碼中看到了這個)。 – PaulMcKenzie

回答

24

它保證預先定義的位置new操作符被調用,而不是任何超載添加到全局命名空間的用戶代碼簽名void* operator new(std::size_t, _T1*)

3

它確保潛在_T1 *投運營商沒有得到unitentionally執行

+1

你能提供一個這種情況發生的簡單例子嗎?這看起來像一個佈局結構,所以指針應該與緩衝區具有相同的對齊方式,通常是'alignof(char */void *)'。 – vsoftco

+0

在Brian的答案中,只有它*通過隱式轉換髮現了一個重載的'new',而不是爲該類型提供的。 –

2

它確保任何void* operator new(size_t, _T1*);都不妨礙它試圖做的新放置。