在浏览Alexander Stepanov原始STL(标准模板库)源代码时,我在内存分配器函数文件中遇到以下内容:defalloc.h
template <class T1, class T2>
inline void construct(T1* p, const T2& value) {
new (p) T1(value);
}
我无法完全理解它,并有以下问题/怀疑:
T1
类型的复制构造函数有关?T1
&amp;模板上的模板。 T2
?它应该是T1*
表示第一个,*T1
表示第二个(值)。new
?我查看了它的用法,并在文件vector.h void push_back(const T& x) { if (finish != end_of_storage) { construct(finish, x); .... .... }
所以基于上面,完成已经获得了内存并被传递到它。另一个参数是x,它是相同类型T的值。这些是我能够思考/理解的几个概念。
在我看来,在整个STL逻辑中使用了非常普遍但重要的功能。有人可以解释一下这个概念吗?
答案 0 :(得分:2)
这是一个展示位置new
,它是一种特定类型的new
,您可以直接指定要用于new
的值的(已分配的)内存。
为什么以上功能是两种类型的模板T1&amp; T2?
在这种情况下,它是一个放置new
,它接受一个值来通过强制转换来初始化不同类型的东西,就像你使用类的构造函数时那样。 (请注意T1
语句中new
的强制转换。
例如,您可以在std::string
和中使用展示位置const char*
构建new
一个可读的简洁函数。在这里,T1 = std::string
和T2 = const char*
。