2014-12-04 51 views
0

雖然經歷的Alexander Stepanov原始STL邏輯的理解(標準模板庫)的源代碼,我遇到從存儲器分配器功​​能文件中:defalloc.h的「構建體」在原始STL實現方法在C++

template <class T1, class T2> 
inline void construct(T1* p, const T2& value) { 
    new (p) T1(value); 
} 

我不能完全理解,並有以下問題/疑慮:

  1. 在我看來,它有事情做與T1類型的拷貝構造函數?
  2. 爲什麼上面的函數是兩種類型的模板T1 & T2?它應該是第一個T1*,第二個(值)應該是*T1
  3. 爲什麼new已經用在上面的邏輯中?我看着它的用途和發現因此,基於上述文件vector.h
void push_back(const T& x) { 
    if (finish != end_of_storage) { 
     construct(finish, x); 
     .... 
     .... 
    } 

以下,光潔度已經收購了存儲和被傳遞到它。另一個參數是x,它是同一類型T的值。這些是我能夠想到/理解的幾個概念。

在我看來,在STL邏輯中已經使用了非常一般而重要的函數。有人能解釋一下上述概念嗎?

+3

這是安置新的。 – chris 2014-12-04 17:20:49

回答

2

這是一個放置new,它是一種特定種類的new,您可以直接指定(已分配的)內存用於new的值。

爲什麼上面的函數是模板上的兩個類型T1 & T2?

在這種情況下,它是一個放置new接受的值通過鑄造,當你使用一個構造一個類來初始化不同類型的東西,因爲你做的。 (請注意聲明T1)。

你可以,例如,在一個單一的,可讀的,簡明的函數構造從const char*一個std::string與放置new。這裏,T1 = std::string和T2 = const char*

Live example on Coliru