2012-12-28 14 views
6

Eventuali duplicati:
Does moving a vector invalidate iterators?È std :: vector :: data() preservato spostandosi?

Considerate i seguenti codici:

std::vector<T> prepare(T*& data) { 
    std::vector<T> buffer; 
    // Fill in buffer. 
    data = buffer.data(); 
    return buffer; 
} 

... 

T* data; 
auto vec = prepare(data); 
// line 12 

E 'possibile che vec.data() != data in linea 12? Allo stesso modo,

std::vector<T> buffer; 
// ... Fill in buffer ... 
T* data = buffer.data(); 
auto vec = std::move(buffer); 
// line 5 

E 'possibile che vec.data() != data in linea 5?

In pratica entrambi non sono possibili nell'implementazione di libstdC++ e libC++, poiché i costruttori di spostamento sono implementati come semplici assegnazioni di puntatori, ma sembra che lo standard non specifichi nulla su di esso (simile a Is the capacity required to be preserved when moving a std::vector?). Può la "costante complessità" garantire che vec.data() == data?

+0

Le cose che invalidano gli iteratori/puntatori sono elencate abbastanza bene. –

+0

Relativi anche: http://stackoverflow.com/questions/4124989/does-stdvectorswap-invalidate-iterators –

risposta

0

La complessità costante indica che il contenitore non può copiare/spostare singoli elementi, pertanto deve trasferire la proprietà dello spazio di archiviazione esistente al nuovo oggetto, pertanto il puntatore restituito da data() deve essere lo stesso.

Per l'assegnazione del movimento (anziché spostare la costruzione) è vero solo se propagate_on_container_move_assignment è true per il tipo di allocatore del vettore o se gli assegnatori sono uguali.

+0

Alcune implementazioni pazze potrebbero spostare/copiare il numero costante di singoli elementi. – zch

+0

@zch: Questo è vietato dal requisito di contiguità. –

+0

@BenVoigt, che dire 'if (<10) copyAll(); else moveOwnership(); '? – zch