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?
来自 here(allocator_traits
的文档),pointer
定义为:
Alloc::pointer if present, otherwise value_type*
因此出现了一个问题:Allocator::pointer
和 Allocator::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
定义明确)
pointer
是 shared_ptr<T>
,所有这些要求都得到了满足。在这种情况下,pointer
肯定与 value_type*
(T*
)不同。
想想一个分配器,它将创建类似指针的对象,如智能指针或类似的东西,即具有指针和引用计数器的结构。只要符合其目的,"non-standard" 指针结构可用于大多数 STL 模板,也可作为专用分配器返回的类型。
作为一个现实的例子,您可以想象一个创建类型 std::shared_ptr
对象的分配器。正确的 typedef 看起来像 typedef std::shared_ptr<T> pointer;
,这与 T*
.
有很大不同
我对一个问题有疑问,特别是
有一部分 留作 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?
来自 here(allocator_traits
的文档),pointer
定义为:
Alloc::pointer if present, otherwise value_type*
因此出现了一个问题:Allocator::pointer
和 Allocator::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
定义明确)
pointer
是 shared_ptr<T>
,所有这些要求都得到了满足。在这种情况下,pointer
肯定与 value_type*
(T*
)不同。
想想一个分配器,它将创建类似指针的对象,如智能指针或类似的东西,即具有指针和引用计数器的结构。只要符合其目的,"non-standard" 指针结构可用于大多数 STL 模板,也可作为专用分配器返回的类型。
作为一个现实的例子,您可以想象一个创建类型 std::shared_ptr
对象的分配器。正确的 typedef 看起来像 typedef std::shared_ptr<T> pointer;
,这与 T*
.