2012-12-17 11 views
8

Ta funkcja członka, która nie ma zdefiniowanego efektu w standardzie (tylko uwagi), miałaby ograniczone zastosowanie, jeśli nie wolno jej ponownie przydzielić. Ale tylko ustęp znalazłem w standardzie, który wydaje się mieć zastosowanie byłoby 23.2.1/11:Czy wektor :: shrink_to_fit może być ponownie przydzielony?

„O ile nie określono inaczej (bezpośrednio lub poprzez zdefiniowanie funkcji w kategoriach innych funkcji), powołując się na członka kontenera funkcja lub przekazanie kontenera jako argumentu funkcji biblioteki nie unieważnia iteratorów ani nie zmienia wartości obiektów w tym kontenerze. "

Ponieważ ponowne przydziały unieważniają iteratory, czy oznacza to, że shrink_to_fit nie może oficjalnie zmienić przydziału? Jeśli tak, funkcja może mieć wpływ tylko na implementacje, w których zmniejszenie zdolności nie powoduje ponownego przydzielenia, jeśli jakiekolwiek ...

Odpowiedz

7

Zgadzam się, intencją jest oczywiście to, że shrink_to_fit() może dokonać realokacji, więc powinno być dozwolone unieważnienie iteratorów.

Byłoby możliwe uhonorowanie żądania tylko wtedy, gdy implementacja zapewnia funkcję podobną do realloc() dla alokatorów, które gwarantowały, że nie będą przenosić pamięci podczas zmniejszania bloku, co nie unieważnia iteratorów. Ale nie uważam, że to jest zamierzone, jak sugeruje recently-added requirement, że jest wymagane do wektora, ponieważ ten wymóg jest istotny tylko wtedy, gdy elementy są przenoszone do nowych lokalizacji, co unieważnia iteratory.

Myślę, że powinieneś submit an issue, aby wyjaśnić, że shrink_to_fit() może unieważnić iteratory. Problem dotyczyłby następujących wersji: basic_string, deque i vector.

+0

gdzie jest wymóg, aby T było przenoszone? – soulie

+1

23.3.6.3 [wektor.capacity] pkt 7 w bieżącym dokumencie roboczym, został dodany po C++ 11 przez [LWG 2033] (http://cplusplus.github.com/LWG/lwg-defects.html# 2033). N.B. termin "MoveInsertable" na _X_ ", nie ma sensu mówić, że typ jest po prostu" MoveDabloczył ", musisz powiedzieć, co wstawiasz _into_ –

+0

Oczywiście te dodatki wyjaśniają w dużym stopniu zamierzony efekt działania . – soulie

Powiązane problemy