stl_construct.h
具有以下功能時到void *:優勢鑄指針使用新
template<typename _T1, typename _T2>
inline void
_Construct(_T1* __p, const _T2& __value)
{
::new(static_cast<void*>(__p)) _T1(__value);
}
我想知道爲什麼鑄造__p
到void*
是必要的,它有什麼優勢?
stl_construct.h
具有以下功能時到void *:優勢鑄指針使用新
template<typename _T1, typename _T2>
inline void
_Construct(_T1* __p, const _T2& __value)
{
::new(static_cast<void*>(__p)) _T1(__value);
}
我想知道爲什麼鑄造__p
到void*
是必要的,它有什麼優勢?
它保證預先定義的位置new操作符被調用,而不是任何超載添加到全局命名空間的用戶代碼簽名void* operator new(std::size_t, _T1*)
。
它確保潛在_T1 *投運營商沒有得到unitentionally執行
你能提供一個這種情況發生的簡單例子嗎?這看起來像一個佈局結構,所以指針應該與緩衝區具有相同的對齊方式,通常是'alignof(char */void *)'。 – vsoftco
在Brian的答案中,只有它*通過隱式轉換髮現了一個重載的'new',而不是爲該類型提供的。 –
它確保任何void* operator new(size_t, _T1*);
都不妨礙它試圖做的新放置。
不確定,但它斷言'__p'是一個可用於放置的指針? –
閱讀我遇到的內部庫代碼的危險是(新)程序員開始在自己的代碼中使用內部代碼(不,我不是在開玩笑 - 我在一些代碼中看到了這個)。 – PaulMcKenzie