平凡的分配器感知容器

trivial allocator aware container?

本文关键字:感知 分配器      更新时间:2023-10-16

我正在学习/玩分配器,试图理解它是如何工作的。但是我在尝试实现接受分配器的普通容器时遇到了问题。现在我以这样结束:

template<class T, class Allocator =std::allocator<T>> class Container {
public:
    using allocator_type    = Allocator;
    using value_type        = T;
    using pointer           = typename std::allocator_traits<allocator_type>::pointer;
    using reference         = value_type&;
    using size_type         = std::size_t;
    Container( size_type n =0 , const allocator_type& allocator =allocator_type() ){
        std::cout << "ctor" << std::endl;
        allocator.allocate(n);
    };
};
int main(int argc, const char* argv[]){
    Container<int> c {5};
    return 0;
}

它给我一个错误member function 'allocate' not viable: 'this' argument has type 'const allocator_type' (aka 'const std::__1::allocator<int>'), but function is not marked const

如何修复这个错误,请问?我错过什么了吗?我打算稍后再使用trait,但希望先使用旧的方式使其工作

你的台词

allocator.allocate(n);

尝试调用allocatorallocate方法,该方法未定义为const方法。但是,如果您查看,allocator的类型是const allocator_type&,即对allocator_type的const引用。

那你怎么用它呢?对于const对象(或对const对象的引用),通常可以做的一件事是从它构造一个不同的非const对象。例如,这将构建:

allocator_type(allocator).allocate(n);

正如SergeyA在评论中正确指出的那样,不构造临时的临时allocator_type是相当常见的,而是创建这样一个成员:

    allocator_type m_alloc; // Should probably be private
    Container( size_type n =0 , const allocator_type& allocator =allocator_type() ) : 
            m_alloc{allocator}{
        std::cout << "ctor" << std::endl;
        m_alloc.allocate(n);
    };