Allocator::pointer 和 Allocator::value_type* 什么时候不同?

When do Allocator::pointer and Allocator::value_type* differ?

我对一个问题有疑问,特别是 答案。
有一部分 留作 reader 的练习(这本身不是问题),特别是 Jonathan Wakely(答案的作者)说:

This code asserts that Allocator::pointer is Allocator::value_type*

用代码表示为:

static_assert(std::is_same<typename AT::pointer, typename AT::value_type*>::value, "Allocator doesn't use fancy pointers");

当时,我得到了原样的答案,仅此而已。
过了一会儿,当我再次阅读它时,我发现自己在大声问:fancy pointers?
来自 hereallocator_traits 的文档),pointer 定义为:

Alloc::pointer if present, otherwise value_type*

因此出现了一个问题:Allocator::pointerAllocator::value_type* 实际上不同的现实情况是什么?

想到的一件事是编写 allocator 规范时可能已经实现的事情。

很久以前,Intel Segmented Memory Model: near, far, and huge 中有不同类型的指针,显示 speed/size 权衡。

如今,在当前的虚拟内存架构下,它们不再有任何实际用途。但是,在旧设置中,从概念上讲,分配器可以 typedef:

 typdef T *huge pointer;

而且它会携带比 T * 更多的信息。

分配器的要求在 [allocator.requirements] 中列出。对于类型 T 的分配器 class X,我看到的相关要求是:

  • X::pointer 可转换为 X::const_pointer
  • *p 的类型为 T&,其中 p 的类型为 X::pointer
  • *q 的类型为 T const&,其中 q 的类型为 X::const_pointer
  • p->m 具有类型 T::m(条件是 (*p).m 定义明确)
  • q->m 具有类型 T::m(条件是 (*q).m 定义明确)

pointershared_ptr<T>,所有这些要求都得到了满足。在这种情况下,pointer 肯定与 value_type*T*)不同。

想想一个分配器,它将创建类似指针的对象,如智能指针或类似的东西,即具有指针和引用计数器的结构。只要符合其目的,"non-standard" 指针结构可用于大多数 STL 模板,也可作为专用分配器返回的类型。

作为一个现实的例子,您可以想象一个创建类型 std::shared_ptr 对象的分配器。正确的 typedef 看起来像 typedef std::shared_ptr<T> pointer;,这与 T*.

有很大不同