8

std::allocatorconstructおよびdestroyメンバー関数は、構築する要素の型でパラメーター化されます。

template<class T>
  class allocator
{
  public:
    typedef T value_type;
    typedef T* pointer;

    template<class U, class... Args>
      void construct(U *p, Args&&... args);

    template<class U>
      void destroy(U *p);

  ...
};

これの根拠は何ですか?なぜ彼らはどちらかを取らないのですvalue_type*pointerallocator<T>type のオブジェクトを構築または破棄する方法のみを知っている必要があるようTです。

4

1 に答える 1

16

allocatorsにtypedefが必要なのも同じ理由です。rebind<U>多くのコンテナは、 Tsを割り当てないためです。

リンクリストを取得します。これらはノードを割り当て、各ノードにはメンバーとしてが含まれますTしたがって、allocatorsは、(を介して)知らないタイプを割り当てることができる必要がありますrebind<U>。ただし、これにはコピー操作が必要です。タイプがの新しいアロケータを作成する必要がありますrebind<U>::other

可能であればそれを避ける方が良いです。したがって、構築と破棄の場合、アロケータは、リンクリストの内部ノードタイプなど、任意のタイプに対して適切な操作を実行する必要があります。これにより、リンクリストの内部ノードタイプをAllocator::construct/destructフレンド関数として使用することもできます。

于 2012-05-11T01:08:00.707 に答える