由于C ++ 11提供了std::allocator_traits
来简化自定义allocator
的使用,因此
自定义allocator
的最低要求应如下:
template <typename Tp>
class SimpleAllocator
{
public:
typedef Tp value_type;
template <typename T>
struct rebind { typedef SimpleAllocator<T> other; };
SimpleAllocator() {}
template <typename T> SimpleAllocator(const SimpleAllocator<T>& other) {}
Tp* allocate(std::size_t n)
{
// do the custom allocate here
}
void deallocate(Tp* p, std::size_t n)
{
// custom deallocate here
}
};
(这是从open-std.org复制的)(我修改了一些格式)
然而,当我使用std::vector<int, SimpleAllocator<int>>
编译时,使用VS2012,
编译器要我提供construct
函数,
所以我被迫实施附加void construct(Tp* p, const Tp& val)
(当然还有void destroy(pointer p)
)。
为什么?我错过了什么?或者是因为VS2012没有提供全面支持?
谢谢!
答案 0 :(得分:1)
您的分配器版本非常好,可以与GCC一起编译。
Here,您可以找到有关最小分配器所需内容以及可以为完整分配器重新实现的内容的深层信息。似乎VS2012的std::allocator_traits
有一个错误,它应该在VS2013中修复,如下所述: