2012-12-17 10 views
8

Questa funzione membro, che non ha alcun effetto definito nello standard (solo osservazioni), avrebbe un uso limitato se non consentito di riallocare. Ma l'unico punto che ho trovato nella norma che sembra applicarsi sarebbe 23.2.1/11:Il vettore :: shrink_to_fit è autorizzato a riallocare?

"Se non altrimenti specificato (esplicitamente o attraverso la definizione di una funzione in termini di altre funzioni), invocando un membro di container la funzione o il passaggio di un contenitore come argomento a una funzione di libreria non deve invalidare gli iteratori o modificare i valori di oggetti all'interno di quel contenitore. "

Poiché le riallocazioni invalidano gli iteratori, ciò implicherebbe che shrink_to_fit non possa essere riallocato formalmente? In tal caso, la funzione potrebbe avere effetto solo su implementazioni in cui la capacità di riduzione non si rialloca, se del caso ...

risposta

7

Sono d'accordo, l'intenzione è ovviamente che shrink_to_fit() possa essere riallocato, quindi dovrebbe essere consentito invalidare gli iteratori.

Sarebbe possibile onorare la richiesta solo se l'implementazione fornisce una funzione simile a realloc() per gli allocatori che hanno garantito di non spostare la memoria durante il restringimento del blocco, il che non invalida gli iteratori. Ma non credo che sia ciò che è inteso, come implicito nello recently-added requirement che T è MoveInsertable nel vettore, poiché tale requisito è rilevante solo se gli elementi vengono spostati in nuove posizioni, il che invalida gli iteratori.

Penso che dovresti submit an issue per chiarire che shrink_to_fit() può invalidare gli iteratori. Il problema si applicherà a basic_string, deque e vector.

+0

dove è necessario che T sia MoveInsertable? – soulie

+1

23.3.6.3 [vector.capacity] paragrafo 7 nel documento di lavoro corrente, è stato aggiunto post-C++ 11 da [LWG 2033] (http://cplusplus.github.com/LWG/lwg-defects.html# 2033). N.B. il termine è "' MoveInsertable' in _X_ ", non ha senso dire che un tipo è solo' MoveInsertable' devi dire cosa lo stai inserendo _into_ –

+0

Certo quelle aggiunte chiariscono molto l'effetto voluto della funzione . – soulie

Problemi correlati