Allocator :: pointer和Allocator :: value_type *何时不同?

时间:2016-03-26 17:11:43

标签: c++ traits allocator

我对一个问题有疑问,特别是关于this回答的问题 有一部分是留给读者的练习(这本身并不是问题),特别是Jonathan Wakely(答案的作者)说:

  

此代码声明Allocator ::指针是Allocator :: value_type *

在代码中表示为:

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

当时,我得到了答案,这就是全部 一段时间后,当我再次阅读时,我发现自己大声问道:花式指针?
hereallocator_traits的文档),pointer定义为:

  

Alloc ::指针(如果存在),否则为value_type *

问题就出现了:Allocator::pointerAllocator::value_type*实际上有什么不同的现实案例?

3 个答案:

答案 0 :(得分:1)

我想到的一件事是在撰写allocator规范时可能是现实的。

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

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

 typdef T *huge pointer;

它将提供的信息不仅仅是T *

答案 1 :(得分:1)

分配器的要求在[allocator.requirements]中列出。对于类型Ext.define('MyApp.view.MyController', { extend: 'Ext.app.ViewController', requires: 'MyApp.view.MyWindow', openWindow: function(){ var win = Ext.widget('addclient'); win.mycallback = this.onAddClientCallback.bind(this); win.show(); }, onAddClientCallback: function(data){ console.log("data from window", data); } }); 的分配器类X,我看到的相关要求是:

  • T可转换为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>绝对不会与pointervalue_type*)相同。

答案 2 :(得分:1)

想象一个分配器,它会创建类似指针的对象,如智能指针或类似的东西,即带指针和引用计数器的结构。只要符合它的目的,“非标准”指针结构就可以在大多数STL模板中使用,也可以作为专用分配器返回的类型。

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