Warum sind std :: allocator :: construct und std :: allocator :: destroy auf Elementtyp templated?

8
Die Funktionen

std::allocator s construct und destroy member werden am Typ des zu konstruierenden Elements parametrisiert:

%Vor%

Was ist der Grund dafür? Warum nehmen sie weder value_type* noch pointer ? Es scheint, als ob allocator<T> nur wissen könnte, wie Objekte des Typs T erstellt oder zerstört werden.

    
Jared Hoberock 11.05.2012, 00:49
quelle

1 Antwort

16

Aus demselben Grund müssen allocator s die rebind<U> typedef haben: weil viele Container niemals T s zuweisen.

Nimm verknüpfte Listen. Diese weisen Knoten zu, von denen jeder ein T als Mitglied enthält. So allocator s sind erforderlich, um einen Typ zuordnen zu können, den sie nicht kennen (via 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 das zu vermeiden. Aus diesem Grund müssen Zuweiser für die Konstruktion 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.

    
Nicol Bolas 11.05.2012, 01:08
quelle

Tags und Links