我已经看到有时候人们会使用这样定义的通用void分配器:
using namespace boost::interprocess;
typedef allocator<void, managed_shared_memory::segment_manager> VoidAllocator;
是否认为这是一种不好的做法?我发现std :: allocator已贬值,我应该关注boost版本吗?
答案 0 :(得分:2)
是的,std::allocator<void>
现在不受欢迎的原因也适用于其他被称为“无效分配者”的事物。
根据p0174r0
类似地,
std::allocator<void>
被定义为各种模板 重新绑定的技巧可能在原始的C ++ 98库中起作用,但是它是 不是实际的分配器,因为它既缺少allocate
也缺少deallocate
成员函数,默认情况下无法从allocator_traits
。 C ++ 11和void_pointer
和const_void_pointer
中的别名allocator_traits
。但是,我们继续指定它是为了 避免破坏尚未升级为支持的旧代码 通用分配器,根据C ++ 11。
您可以轻松定义模板别名。
using namespace boost::interprocess;
template <typename T>
using segment_allocator = allocator<T, managed_shared_memory::segment_manager>;
答案 1 :(得分:1)
我认为这不是一个坏习惯,但大多数情况下是没有用的。
allocator
中的void
无法分配任何内容,也没有任何有用的特征。
因此,最后它仅对重新绑定有用。
而且,如果您要重新绑定,则实际上可以将void
替换为char
。
也许会有一个“对称”参数来拥有一个void
分配器,但是由于没有reference
,size_type
或其他典型特征成员,这会造成混乱。
(重新绑定分配器的想法首先很奇怪,可能是旧语言的局限性。分配器不需要知道他们正在分配的类型,因为充其量是多余的,最坏的情况是容器通常重新绑定到仍然需要的类型(例如节点类型)。