2016-07-25 23 views
12

Patrząc na std::allocator, widzę, że członkowie:
value_type, pointer, const_pointer, reference, const_reference, size_type, difference_type i rebind wszystkie zostały przestarzała.Dlaczego std :: allocator traci typy/funkcje członków w C++ 17?

Selektory również nie mają członków:
address, max_size, construct lub destroy.

Dlaczego tak się stało? Czy miało to jakiś związek z dzielnikami wieloznacznymi?

+1

Pierwszy zestaw członków wygląda na sensowny w przypadku kontenerów, a nie przydzielających. Wierzę, że istnieje 'std :: addressof', który zastąpi teraz adres(). Kto i tak potrzebuje max_size; a reszta powinna być wymienna przez wywołanie nowego/jawnego wywołania destruktora. –

+1

Istnieje teraz również ['allocator_traits'] (http://en.cppreference.com/w/cpp/memory/allocator_traits), które uzupełnią brakujące części. –

Odpowiedz

9

Jeśli spojrzeć na the relevant isocpp paper widać, że pierwszy zestaw, o którym wspomniałeś, jest teraz uważany za lepiej umieszczony w std::allocator_traits. Odkąd pojawiła się biblioteka STL (nawet standardowa biblioteka), nastąpiła zmiana w używaniu cech.

rebind to także relikwia. Kiedy wyszedł pierwszy STL, aliasy i parametry szablonu szablonu nie były obsługiwane. Dzięki istniejącym funkcjom językowym rebind wydaje się dość zawiłe. Np., Jak można zobaczyć w an answer to this question, w języku programowania C++, wydanie 4, sekcja 34.4.1, str. 998, komentując 'klasyczną' członek ponownego wiązania w domyślnej klasie przydzielania:

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

Bjarne Stroustupr pisze tak: „. Ciekawostką szablon ponownego wiązania jest archaiczny alias Powinno być:

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

jednak alokator został zdefiniowany zanim takie aliasy były obsługiwane przez C++. "

Tak więc, to standardowa biblioteka nadrabiająca zmiany językowe i paradygmatyczne.