2016-07-25 7 views
12

Während bei std::allocator suchen, ich sehe, dass Mitglieder:
value_type, pointer, const_pointer, reference, const_reference, size_type, difference_type und rebind sind alle veraltet.Warum hat std :: allocator Membertypen/Funktionen in C++ 17 verloren?

Zuweiser werden auch nicht mehr über die Mitglieder:
address, max_size, construct oder destroy.

Warum ist das passiert? Hatte es etwas mit polymophischen Allokatoren zu tun?

+1

Die erste Gruppe von Mitgliedern sieht so aus, als wären sie wirklich sinnvoll für Container, nicht für Allokatoren. Ich glaube, dass es jetzt eine 'std :: addressof' gibt, um address() zu ersetzen. Wer benötigt sowieso max_size; und der Rest sollte durch den neuen/expliziten Destruktoraufruf ersetzbar sein. –

+1

Es gibt jetzt auch ein ['allocator_traits'] (http://en.cppreference.com/w/cpp/memory/allocator_traits), das die fehlenden Teile ausfüllt. –

Antwort

9

Wenn Sie the relevant isocpp paper betrachten, können Sie sehen, dass der erste Satz, den Sie erwähnen, jetzt besser in platziert ist. Seit die STL (nicht einmal Standardbibliothek) herauskam, gab es mehr eine Verschiebung, um Eigenschaften zu verwenden.

rebind ist auch ein Relikt. Als die STL zum ersten Mal erschien, wurden Aliase und Template-Template-Parameter nicht unterstützt. Mit diesen Sprachfunktionen scheint rebind ziemlich verschachtelt. Z. B., wie Sie in an answer to this question sehen können, in der C++ Programmiersprache, 4. Ausgabe, Abschnitt 34.4.1, p. 998, das 'klassische' rebind Mitglied in Standard allocator Klasse Kommentierung:

template<typename U> 
    struct rebind { using other = allocator<U>;}; 

Bjarne Stroustupr schreibt dazu: „. Die neugierigen rebind Vorlage ist ein archaisches alias Es hätte sein sollen:

template<typename U> 
using other = allocator<U>; 

jedoch Allokator wurde definiert, bevor solche Aliase von C++ unterstützt wurden. "

Insgesamt ist es die Standardbibliothek, die die Sprache und Paradigmenwechsel einholt.