2014-12-04 48 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