2012-05-11 9 views
8

std::allocator s‘construct und destroy Mitgliederfunktionen parametrisiert sind von der Art des Elements zu konstruieren:Warum sind std :: allocator :: construct und std :: allocator :: destroy auf Elementtyp Templated?

für diesen
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); 

    ... 
}; 

Was ist der Grund? Warum nehmen sie weder value_type* noch pointer? Es scheint wie allocator<T> sollte nur wissen, wie Objekte des Typs T zu konstruieren oder zu zerstören.

Antwort

16

Es ist aus dem gleichen Grund, dass allocator s erforderlich sind, um die rebind<U> typedef haben: weil viele Container nie T s zuordnen.

Nehmen Sie verknüpfte Listen. Diese weisen Knoten zu, von denen jeder ein T als Mitglied enthält. So sind allocator s erforderlich, um einen Typ zuordnen zu können, den sie nicht kennen (über rebind<U>). Dies erfordert jedoch einen Kopiervorgang: Es muss ein neuer Zuordner vom Typ rebind<U>::other erstellt werden.

Es ist besser, wenn möglich zu vermeiden. Aus diesem Grund müssen Zuweiser für den Aufbau und die Vernichtung die entsprechenden Operationen für jeden Typ ausführen, z. B. die internen Knotentypen der verknüpften Liste. Dies ermöglicht auch, dass der interne Knotentyp der verknüpften Liste Allocator::construct/destruct als Friend-Funktionen hat.