使用 boost void 分配器是不好的做法吗?

Is using a boost void allocator bad practice?

我看到有时人们使用这样定义的通用 void 分配器:

using namespace boost::interprocess;
typedef allocator<void, managed_shared_memory::segment_manager> VoidAllocator;

这被认为是一种不好的做法吗?我发现 std::allocator 已经贬值了,我应该关注 boost 版本吗?

我不认为这是不好的做法,但主要是无用的做法。

voidallocator 不能分配任何东西,也没有任何有用的特征。 所以最后它只对重新绑定有用。 如果你重新绑定,你实际上可以用 char 替换 void

也许有一个 "symmetry" 论据来拥有一个 void 分配器,但它会造成混淆,因为没有 referencesize_type 或其他典型特征成员。

(重新绑定分配器的想法首先很奇怪,可能是旧语言限制的残余。分配器不需要知道它们正在分配的类型,因为最好的情况是多余的,最坏的情况下容器通常重新绑定到它真正需要的类型——例如节点类型——。)

是的,std::allocator<void> 现在不受欢迎的原因也适用于其他声称是 "allocators of void" 的事物。

根据p0174r0

Similarly, std::allocator<void> is defined so that various template rebinding tricks could work in the original C++98 library, but it is not an actual allocator, as it lacks both allocate and deallocate member functions, which cannot be synthesized by default from allocator_traits. That need went away with C++11 and the void_pointer and const_void_pointer type aliases in allocator_traits. However, we continue to specify it in order to avoid breaking old code that has not yet been upgraded to support generic allocators, per C++11.

您可以轻松定义模板别名。

using namespace boost::interprocess;
template <typename T>
using segment_allocator = allocator<T, managed_shared_memory::segment_manager>;