2016-03-26 5 views
2

質問には疑問があります。具体的にはthisです。
特にジョナサンWakely(答えの作者が)と言わがリーダのための運動として残っていることの部分は、(それが自身のために問題ではありません)があります:このコードは、アサートAllocator :: pointerとAllocator :: value_type *はいつ異なるのですか?

アロケータ::ポインタがアロケータです::ようなコードで表現されてVALUE_TYPE *

こと:あると同時に

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

は、私は答えを持っているのです すべて。
しばらくしてからもう一度読んでいたとき、私は自分自身に声をかけて尋ねました。魅力的なポインタ? 、pointerは次のように定義されてhereallocator_traitsのドキュメント)から

のAlloc ::ポインタ存在する場合、それ以外のVALUE_TYPE *

質問は、このように発生した:中Allocator::pointer現実的なケースは何ですか実際にはAllocator::value_type*は違いますか?

+0

私は実際に私を傷つけるだろうが、それは理にかなっている...私はそれが世界のほぼすべての国で違法であるべきだと思うにもかかわらず!本当にその場合ですか? – skypjack

答えて

1

アロケータの要件は、[allocator.requirements]に配置されています。タイプTためのアロケータクラスXについては、私が見る関連の要件は次のとおりです。X::pointer

  • *qT const&場所を入力した

    • X::pointerは型であるpT&を、入力したX::const_pointer
    • *pに変換可能ですqは、タイプX::const_pointer
    • p->mのタイプです。T::m
    • q->mがこれらの要件の全てをpointershared_ptr<T>ことによってsatisfedれる((*q).m明確に定義されているが条件)

    T::mを入力した((*p).m明確に定義されているが条件)。その場合、pointerは、確かにvalue_type*(これはT*)と同じではありません。

  • +0

    それについては決して考えませんでしたが、それは完全に理にかなっています。好奇心のために、あなたはそのようなアロケータを使ったことがありますか?私はそれのようなものを見たことがない。 – skypjack

    1

    allocatorスペックが書かれたときに現実的だったかもしれないものがあります。

    非常にずっと前に、Intel Segmented Memory Modelnear, far, and hugeにさまざまな種類のポインタがあり、速度とサイズのトレードオフが表示されていました。

    現在、現在の仮想メモリアーキテクチャでは、もはや実際の使用はありません。古い設定では、しかし、概念的アロケータはtypedef可能性:

    typdef T *huge pointer; 
    

    、それだけでT *よりも多くの情報を運ぶだろう。

    +0

    お返事ありがとうございます。だから、あなたはそれをコンピュータサイエンスのもうひとつの時代から来て、今日はそれほど意味をなさないものにすることを提案しますか?興味深いことに、実際には実際のシナリオでの使用は考えられませんが、私はそんな熟練した開発者ではありません... – skypjack

    1

    スマートポインタのようなポインタのようなオブジェクト、つまりポインタと参照カウンタを持つ構造体を作成するアロケータを考えてみましょう。その目的を果たす限り、「非標準」のポインタ構造は、ほとんどのSTLテンプレートで使用でき、特殊なアロケータによって返される型としても使用できます。

    現実的な例として、std::shared_ptrのオブジェクトを作成するアロケータを想像することができます。適切なtypedefはtypedef std::shared_ptr<T> pointer;のようになり、T*と大きく異なります。

    関連する問題