2012-10-28 29 views
5

Ho notato che i requisiti di std :: vector sul suo tipo elememt T sono passati da C++ 03 a C++ 0x. Ora non è più necessario copiare la costruzione, ma è sufficiente spostare la costruibilità.Gli elementi vettoriali devono essere mobili?

E 'richiesto per T anche se non lo potremmo potenzialmente riallocare?

vector<boost::scoped_ptr<int>> x(numberElements); 

Non vedo alcuna necessità di spostamento qui. Cosa dice la specifica?

+0

Beh, è ​​richiesto dallo standard ... anche se la tua implementazione effettiva può funzionare perfettamente con oggetti immobili. –

+0

@kerrek mi sembra che questa sia una perdita di funzionalità maggiore rispetto agli array 'new'. qual è la ragione del requisito? –

+0

Puoi sempre avere un 'std :: unique_ptr p (nuovo T [N])' per allocazioni "solo una volta". Il requisito è solo una parte dei requisiti del contenitore standard ... Non so * perché * non contiene un sacco di eccezioni speciali, oltre a mantenere il concetto semplice. Ad esempio, è possibile utilizzare 'std :: vector >' per lo stesso codice generato in C++ 11 come propria soluzione, quindi non è in realtà un evento a breve termine. –

risposta

3

In base a 23.3.6.2 [vector.cons] paragrafo 4 il costruttore che si sta utilizzando richiede DefaultInsertable. Poiché il costruttore non è uno dei costruttori per la tabella dei requisiti che richiede anche CopyInsertable, non dovrebbero esserci requisiti aggiuntivi. Secondo 23.2.1 [container.requirements.general] punto 13, DefaultInsertable significa che la seguente espressione è ben formato:

allocator_traits<A>::construct(m, p); 

Sembra, ciò significa che la risposta dipende l'allocatore usate A. Non mi interessa affatto analizzare il significato più profondo di 20.6.7.2 [allocator.uses.construction]. Facciamo la fuga dall'istruttore: determinare cosa significa questo paragrafo è lasciato come esercizio!

+0

+1 * Solo * 'DefaultInsertable' è richiesto da' T' per questo costruttore. 'T' non deve essere' MoveConstructible' né 'CopyConstructible'. Quando viene utilizzato l'allocatore predefinito, 'DefaultInsertable' implica' DefaultConstructible'. Il codice di Johannes è conforme (supponendo che 'boost :: scoped_ptr ' sia nel campo di applicazione e significhi ciò che tutti pensiamo significhi). –

+0

@howard ah, grazie per la spiegazione. ora posso dormire senza preoccuparmi del mio codice. –

+0

@ JohannesSchaub-litb: ho detto che era conforme non portatile. ;-) Non sono sicuro di quante implementazioni siano corrette in questo momento. So che libC++ lo è. Sarei interessato a sapere quali altre implementazioni funzionano con il tuo esempio. –

Problemi correlati