2016-06-07 10 views
11

In altre parole è il seguente codice di suono (comportamento definito, portatile, ...)E 'sicuro per chiamare vector.resize (0) dopo aver mosso i suoi contenuti

std::vector<int> vec(100,42); 
    std::vector<int> other = std::move(vec); 
    vec.resize(0);//is this sound 

    //using vec like an empty vector 
+2

È possibile eseguire * qualsiasi * con quel 'vector' che non si aspetta proprietà particolari (oltre la validità). Preferirei 'clear()' su 'ridimensiona (0)', comunque. – Walter

risposta

9

Sì, è sicuro.

Da §23.3.6.5:

Se sz <= size(), equivalente alla chiamata pop_back()size() - sz volte. Se size() < sz, aggiunge sz - size() elementi inseriti di default alla sequenza.

Quindi, in pratica, quando si chiama resize(0), si chiama pop_back() fino a quando ogni elemento viene rimosso dal vettore.

Non importa che si è spostato vec, perché anche se lo stato di vec non è specificato, è ancora un vettore valido che è possibile modificare.

Quindi, std::vector sarà vuoto dopo una chiamata a resize(0).

+3

No, non è possibile chiamare 'pop_back()', perché 'pop_back()' ha le precondizioni. Tuttavia, 'size()' non lo fa, e una volta che hai chiamato 'size()', e assicurato che è maggiore di 0, hai controllato che il vettore soddisfi le precondizioni di 'pop_back()', e così è quindi sicuro chiamarlo. –

+4

[FYI] È un [difetto] (http://wg21.cmeerw.net/lwg/issue2160) per definire 'ridimensiona' in termini di' pop_back'. – NathanOliver

5

Dopo aver spostato da un oggetto, in genere non è possibile formulare alcuna ipotesi sullo stato dell'oggetto. Ciò significa che puoi solo chiamare funzioni membro che non hanno precondizioni. Fortunatamente, std::vector::resize non ha precondizioni dipendenti dal valore, quindi è possibile chiamare resize su un vettore spostato da.

+0

* in genere non è possibile formulare alcuna ipotesi sullo stato dell'oggetto * ** errato **: si può presumere che sia valido. Questo è il punto. – Walter

+0

Per quanto riguarda le precondizioni menzionate per il ridimensionamento. §23.3.6.3: 13 * Richiede: T deve essere MoveInsertable e DefaultInsertable in * this. * –

+4

@Walter: Va da sé. Ogni oggetto è valido Altrimenti non è un oggetto. –

Problemi correlati