Si dice che è a causa delle specifiche delle eccezioni here. Non lo capisco. Questa domanda ha qualche relazione con le specifiche delle eccezioni?perché l'allocatore in C++ ha bisogno di un costruttore di copie?
risposta
Dopo aver letto il tutorial mi sono un po 'confuso dal testo. Ma io credo che sia semplice come questo: il tutorial stava spiegando il motivo per cui intestazione modello del allocatore mostra
allocator(const allocator&) throw();
e
template <class U> allocator(const allocator<U>&) throw();
anche se il costruttore di copia è abbastanza inutile per un allocatore. E la risposta è stata che la specifica di un allocatore non consente al costruttore di generare eccezioni. Pertanto, l'interfaccia pubblica del costruttore di copie definisce i costruttori di copie con una specifica di eccezione di throw()
(non genera eccezioni) per impedire a qualcuno di derivare il proprio allocatore con i costruttori di copia che potrebbero generare un'eccezione.
Vedere this link per una buona descrizione di cosa sia una specifica di eccezione se è questo che ti ha lanciato. (No pun intended.)
Quindi, non significava che quando si crea un allocatore, è necessario fornire un costruttore di copie. Stavano solo sottolineando che la specifica vieta in modo specifico di definire uno che genera eccezioni. `
L'allocatore richiede un costruttore di copia perché i contenitori hanno un costruttore di copia e dovranno copiare il loro allocatore nel processo.
È necessario scrivere esplicitamente un costruttore di copia (anziché utilizzare il valore predefinito) poiché è necessario definire il costruttore di copie per un allocatore C++ 03 con l'identificatore di eccezione throw()
. Il costruttore di copie predefinito non ha questo identificatore.
Tecnicamente, non si dispone di , ma se si genera un'eccezione ... beh, buona fortuna con quello.
Ma questo è solo un fastidio minore, poiché gli allocatori in C++ 03 non possono avere lo stato. Quindi non dovresti copiare membri in giro. Il costruttore di copie può essere vuoto.
Nicol Bolas, sarà OK se allocator (const allocator &) = delete ;? come siamo nel 2016 –
In realtà è piuttosto semplice. Il costruttore di un contenitore che utilizza un allocatore prende l'allocatore e ne memorizza una copia. Per fare ciò, è necessario che l'allocatore sia CopyConstructible
. È tutto. Si noti che un tipo di allocatore non è richiesto per CopyAssignable
a meno che il suo tratto propagate_on_container_copy_assignment
sia vero (che è raro).
La specifica C++ 11 afferma inoltre che "Nessuna operazione di costruzione, confronto operatore, operazione di copia, spostamento o scambio su questi tipi deve uscire da un'eccezione." Le regole di eccezione consentono di effettuare una copia (stack) di un allocatore (in particolare durante la costruzione o la distruzione) senza preoccuparsi che la copia che l'allocatore genererà. Progettare contenitori che siano sicuri per le eccezioni in presenza di allocatori che potrebbero generare copie, spostamenti, scambi o confronti è quasi impossibile. In pratica, un allocatore non può contenere molto più di un puntatore a qualche risorsa, quindi consentire agli allocatori di eseguire copie, ecc., Aggiungerebbe molto dolore senza praticamente alcun guadagno.
- 1. Perché la classe String ha un costruttore di copie?
- 2. Perché il passaggio per riferimento coinvolge un costruttore di copie?
- 3. Costruttore di copie strano
- 4. Perché C ha bisogno di matrici se ha puntatori?
- 5. Perché questo codice tenta di chiamare il costruttore di copie?
- 6. Posso chiamare esplicitamente un costruttore di copie?
- 7. Perché il C++ ha bisogno di sinonimi di operatore?
- 8. Perché il costruttore derivato ha bisogno di un distruttore di base?
- 9. Perché il costruttore di copie non è stato elidato qui?
- 10. entità Java - perché ho bisogno di un costruttore vuoto?
- 11. Perché il compilatore fornisce il costruttore di copie predefinito
- 12. Costruttore di copie esplicite e std :: sort
- 13. Come estendere un costruttore di copie generato dal compilatore
- 14. Perché abbiamo bisogno di un quarto costruttore per Lollipop?
- 15. Perché JAXB ha bisogno di un costruttore no arg per il marshalling?
- 16. Perché questa proprietà ha bisogno di "conservare"?
- 17. Perché il web ha bisogno di HTTP?
- 18. Perché Idris ha bisogno di essere reciproco?
- 19. Perché l'inizializzazione della copia è così com'è? Perché richiedere il costruttore di copie?
- 20. Avvio di wxWidgets C++ ha bisogno di un leggero spintore
- 21. Perché una classe usata come valore in una mappa STL ha bisogno di un costruttore predefinito in ...?
- 22. Implementazione del costruttore di copie in termini di operatore =
- 23. C++ Perché vettore di inizializzazione chiama il costruttore di copia
- 24. Perché PHP non ha un costruttore predefinito?
- 25. Perché Lucene QueryParser ha bisogno di un analizzatore
- 26. Perché un tag `a` ha bisogno di` tabindex = 0`?
- 27. Perché removeChild ha bisogno di un nodo genitore?
- 28. vector :: push_back insiste sull'uso del costruttore di copie anche se viene fornito un costruttore di spostamenti
- 29. Perché l'argomento del costruttore di copie è un riferimento anziché un puntatore?
- 30. Perché non viene fornito un costruttore di copie predefinito da un file volatile?
Prima di C++ 11, gli allocatori erano necessariamente senza stato. Di conseguenza, è sufficiente chiamare il costruttore predefinito.Post C++ 11, indipendentemente dal fatto che gli allocatori siano copiati dai rispettivi contenitori che li racchiudono in una determinata circostanza, è determinato dalla presenza e dalla definizione dei metodi allocatori 'select_on_container_X_Y'. Vedere il [riferimento dei tratti allocator] (http://en.cppreference.com/w/cpp/memory/allocator_traits) – apmccartney