C++ 中原始 STL 实现中“构造”方法的逻辑理解 [复制]

The understanding of logic of "construct" method in original STL implementation in C++ [duplicate]

提问人:Mantosh Kumar 提问时间:12/5/2014 更新时间:12/5/2014 访问量:85

问:

在浏览 Alexander Stepanov 原始 STL(标准模板库)源代码时,我从内存分配器函数文件中遇到了以下内容:defalloc.h

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

我无法完全理解它,并且有以下问题/疑问:

  1. 在我看来,它与类型的复制构造函数有关?T1
  2. 为什么上面的函数是模板上两种类型&?。它应该是 first 和 second(value)。T1T2T1**T1
  3. 为什么在上述逻辑中使用了?我查看了它的用途,并在文件 vector.h 中找到了以下内容new
void push_back(const T& x) {
  if (finish != end_of_storage) {
      construct(finish, x);
        ....
        ....
    }

因此,基于上述内容,finish 已经获取了内存并被传递到内存中。另一个参数是 x,它是相同类型 T 的值。这些是我能够思考/理解的几个概念。

在我看来,它非常通用但很重要的功能,在整个 STL 逻辑中都使用过。有人可以解释上面的概念吗?

C++ STL new-operator 复制构造函数 分配器

评论


答:

2赞 JBL 12/5/2014 #1

它是一种放置,这是一种特定类型,您可以在其中直接指定要用于值的(已分配的)内存。newnewnew

为什么上述函数在两种类型 T1 和 T2 上是模板?

在本例中,它是一个接受值以通过强制转换初始化不同类型的东西的放置,就像使用类的构造函数时所做的那样。 (注意语句上的强制转换)。newT1new

例如,您可以构造 a from a 和 placed 在一个可读的简洁函数中。这里,T1 = 和 T2 = 。std::stringconst char*newstd::stringconst char*

Coliru 上的现场示例