C++ 分配器_traits::construct()与分配器_traits::allocate()的比较

C++ 分配器_traits::construct()与分配器_traits::allocate()的比较,c++,memory-management,c++11,C++,Memory Management,C++11,C++11提供了std::allocator\u traits类作为使用分配器的标准方法。静态函数std::allocator\u traits::construct()获取一个指向对象应该构造的位置的指针。但是,std::allocator\u traits::allocate()静态函数返回一个allocator::pointer值,该值只需表现为指针,但不一定是指针(通常,尽管std::allocator::pointer必须是指针) 如果分配和构造静态方法通常用于不兼容的类型,那么应该如

C++11提供了
std::allocator\u traits
类作为使用分配器的标准方法。静态函数
std::allocator\u traits::construct()
获取一个指向对象应该构造的位置的指针。但是,
std::allocator\u traits::allocate()
静态函数返回一个
allocator::pointer
值,该值只需表现为指针,但不一定是指针(通常,尽管
std::allocator::pointer
必须是指针)


如果分配和构造静态方法通常用于不兼容的类型,那么应该如何使用它们?只有当
指针
类型实际上可转换为普通指针时,才能使用它们吗?

根据您目前的情况,有两种方法可以实现这一点

如果您有一个左值表达式,比如节点中的值字段,那么您可以使用std::addressof,如下所示:

allocator_traits<allocator_type>::construct(alloc, std::addressof(ptr->value), ...);
现在你可以说:

allocator_traits<allocator_type>::construct(alloc, to_raw_pointer(ptr), ...);
allocator_traits::construct(alloc,to_raw_指针(ptr));

从C++20开始,在中提出了。

哦,哇,一个人永远不会完成学习。。。
操作符->()
的语义非常令人难以置信:你为什么在
指针前面写
(p.operator->())
?是否存在ADL会造成干扰的危险,或者这只是一种习惯?我认为当两个重载都在同一个名称空间中时,这并不重要。我认为查找只会找到第二个重载是一种妄想,但在测试中我发现它根本不需要。在撰写会员互换时,我偶尔会遇到类似的问题,因此我养成了总是排位赛的习惯,除非我真的想让ADL接手。+1目前这是一个非常有洞察力的问题。探索这些水域的C++程序员非常少。实施者必须这样做。这让我问了一个问题:你是std::lib实现者吗?@HowardHinnant:谢谢!这个问题与一个小型向量类的设计有关,该类在
std::vector
上有几个额外的铃铛和哨子(例如,自动使用静态存储,最多使用几个元素,支持SSE和其他向量指令,等等)。只是想尝试以“正确”的方式来处理分配器支持。
allocator_traits<allocator_type>::construct(alloc, to_raw_pointer(ptr), ...);