首页 > 解决方案 > std::vector 的复制构造函数使用哪个分配器来分配内存?

问题描述

我有一个自定义分配器模板MyAllocator<T>。我正在尝试创建一个基本上归结为以下内容的类模板:

template<typename T>
class MyClass<T> {
    std::vector<T, MyAllocator<T>> &data;
public:
    MyClass(std::vector<T, MyAllocator<T>> &data) : data(data) {}
    MyClass(std::vector<T> &data) : data(data) {}
}

我的意图是避免data在其内存分配由MyAllocator<T>. 我知道这在某些情况下可能很麻烦,但是这个类是一个短命的实用程序包装器,这是一个性能关键的应用程序。

然而,让我感到困惑的部分是第二个构造函数的成员初始化列表。仔细查看文档后,我似乎无法解释为什么此操作是类型安全的。我的理解是data(data)寻找构造函数std::vector<T, MyAllocator<T>>::vector(std::vector<T, std::allocator<T>>)(或传递引用的变体)。这个构造函数似乎不存在,但我没有遇到任何编译时类型错误。

起初我以为是因为data成员变量是引用,但将其更改为值并没有产生任何类型错误。MyAllocator不是 的子类std::allocator,所以我也看不出隐式强制转换如何对这种行为负责。

我错过了什么?如果这确实是合法代码,那么第二个构造函数是否MyAllocator会像我希望的那样创建一个新的内存分配?

标签: c++allocator

解决方案


推荐阅读