2013-09-25 11 views
5

wektor ma to w każdym rodzaju konstruktoraDlaczego alokator jest const w wektorze?

const allocator_type& alloc = allocator_type() 

Dlaczego const? Nie rozumiem, jak to by się przydało. Widzę przekazanie w alokatorze, więc wiele wektorów może współdzielić tę samą pulę, ale zostać zgrupowane z innymi wiązkami wektorów. Jednak z const nie oznacza to, że będą kopiować tylko dane instancji? kopiowanie puli lub cokolwiek to jest, nie wydaje się przydatne.

Dlaczego to jest const?

+3

Zawsze można mieć alokator, który przechowuje tylko odniesienie do puli (shared_ptr?), Więc kopiowanie jest w porządku. –

+1

Alokator! = Pula. Dlatego kopiowanie alokatora nie oznacza logicznie kopiowania puli. Twoja argumentacja jest nieważna :) – sehe

+0

@sehe: Prawidłowo jesteś! To mnie rozśmieszyło. – user2814152

Odpowiedz

4

Właściwie przekazanie alokatora jako const odniesienia i skopiowanie go wewnątrz kontenera upraszcza. W przeciwnym razie, gdyby tylko odniesienie zostało przekazane, musisz upewnić się, że alokator nie zostanie zniszczony przed kontenerem. Po prostu musisz udostępnić stan alokatora między jego kopiami. Możesz to zrobić po prostu trzymając pulę w numerze shared_ptr.

+1

@JurajBlaho: Wikipedia jest, obawiam się, nieaktualna. Podczas gdy C++ 98 (i C++ 03) wymagało, aby instancja przydzielnika danego typu była równoważna instancji alokatora tego samego typu, w alokatory C++ 11 * mają wartość * semantyka (i stan). –

4

Alokatory powinny mieć semantykę wartości, co oznacza, że ​​wektor przechowuje je według wartości (zauważ, że get_allocator() zwraca wartość). Tak więc konstruktor może z łatwością wziąć alokator przez odniesienie do const i po prostu go skopiować.

+0

Jestem bardzo zdezorientowany, dlaczego to zostało odrzucone. – sehe

+0

@sehe Ja też. Ale nie ma sposobu, aby poprosić o komentarz, niestety. – Angew

Powiązane problemy