我猜这个问题确实与std::allocator_traits
的设计以及提供自定义分配器有关。如果要使用自定义分配器构造std::shared_ptr<>
,可以使用std :: allocator_traits吗?
基本上,这是正确的吗?
WidgetAllocator allocator;
std::shared_ptr<Widget> widget(allocator.allocate(), std::allocator_traits<WidgetAllocator>::deallocate);
答案 0 :(得分:2)
基本上,这是正确的吗?
std::shared_ptr<Widget> widget(allocator.allocate(), std::allocator_traits<WidgetAllocator>::deallocate);
那是不正确的。
首先,不能保证分配器具有无效的allocate
成员函数。
好的,让我们假设WidgetAllocator
确实提供了这样的重载,尽管这对于分配器而言并不是很典型。但更重要的是,std::allocator_traits::deallocate
不可与Widget*
一起调用。其参数列表为( Alloc& a, pointer p, size_type n )
。
那么allocator_traits的建议用法是什么?
无论何时要使用分配器的可选功能之一,例如std::allocator_traits
,都应使用Alloc::is_always_equal
,而您要使用的分配器都不使用提供可选功能,或者分配器是模板参数,并且您希望支持所有分配器,无论它们是否提供可选功能。
std::allocator_traits
为分配器的可选功能提供默认实现。
我应该直接在分配器上调用方法吗?
如果使用的分配器提供成员函数,则 可以直接调用成员函数;对于一般情况,如果不是可选的,则可以调用成员函数。不过,不必直接调用成员,您可以始终使用分配器特征。