Se dice here que es debido a la especificación de la excepción. No lo entiendo. ¿Tiene esta pregunta alguna relación con la especificación de excepciones?¿por qué el asignador en C++ necesita un constructor de copia?
Respuesta
Después de leer el tutorial, estaba un poco confundido por la redacción. Pero creo que es tan simple como esto: el tutorial se explica por qué cabecera de la plantilla del asignador muestra
allocator(const allocator&) throw();
y
template <class U> allocator(const allocator<U>&) throw();
pesar de que el constructor de copia es bastante inútil para un asignador. Y la respuesta fue que la especificación de un asignador no permite que el constructor genere excepciones. Por lo tanto, la interfaz pública del constructor de copias define los constructores de copias con una especificación de excepción de throw()
(no arroja ninguna excepción) para evitar que alguien derive su propio asignador con constructores de copia que puedan arrojar una excepción.
Consulte this link para obtener una buena descripción de lo que es una especificación de excepción si eso es lo que le está tirando. (Sin juego de palabras. Realmente.)
Por lo tanto, no significa que al crear un asignador, debe proporcionar un constructor de copia. Simplemente señalaban que la especificación específicamente le prohíbe definir uno que arroje alguna excepción. `
El asignador requiere un constructor de copia porque los contenedores tienen un constructor de copia y necesitarán copiar su asignador en el proceso.
Tiene que escribir explícitamente un constructor de copia (en lugar de usar el predeterminado) porque el constructor de copia para un asignador C++ 03 debe definirse con el especificador de excepción throw()
. El constructor de copia predeterminado no tiene este especificador.
Técnicamente, usted no tiene, pero si arroja una excepción ... bueno, buena suerte con eso.
Pero eso es solo una pequeña molestia, ya que los asignadores en C++ 03 no pueden tener estado. Entonces no deberías estar copiando miembros. El constructor de copia puede estar vacío.
Nicol Bolas, ¿estará bien si el asignador (const allocator &) = delete ;? como estamos en 2016 –
En realidad es bastante simple. El constructor de un contenedor que usa un asignador toma el asignador y almacena una copia del mismo. Para hacer eso, necesita que el asignador sea CopyConstructible
. Eso es todo. Tenga en cuenta que no se requiere un tipo de asignador a CopyAssignable
a menos que su rasgo propagate_on_container_copy_assignment
sea verdadero (lo cual es raro).
La especificación C++ 11 también establece que "Ningún constructor, operador de comparación, operación de copia, operación de movimiento o operación de intercambio en estos tipos saldrá a través de una excepción". Las reglas de excepción le permiten hacer una copia (pila) de un asignador (especialmente durante la construcción o destrucción) sin preocuparse de que se produzca la copia del asignador. Es casi imposible diseñar contenedores que sean a prueba de excepciones en presencia de asignadores que puedan arrojar al copiar, mover, intercambiar o comparar. En la práctica, un asignador no puede contener mucho más que un puntero a algún recurso, por lo que permitir que los asignativos arrojen en la copia, etc., agregaría mucho dolor prácticamente sin ganancia.
- 1. ¿Por qué mi subclase de C++ necesita un constructor explícito?
- 2. asignador STL, constructor de copia de otro tipo, remapean
- 3. ¿Por qué pasar por referencia implica un constructor de copia?
- 4. ¿Por qué el constructor EnumMap necesita un argumento de clase?
- 5. Por qué el compilador proporciona el constructor de copia predeterminado
- 6. ¿Por qué no se elimina el constructor de copia aquí?
- 7. const en constructor de copia en C++
- 8. ¿Por qué JAXB necesita un constructor no arg para ordenar?
- 9. ¿Por qué se llama este constructor de copia en lugar de mover el constructor?
- 10. ¿Por qué el constructor de copia implícita llama al constructor de copia de la clase base y el constructor de copia definido no?
- 11. constructor o constructor de copia?
- 12. ¿Por qué este código intenta llamar al constructor de copia?
- 13. ¿En qué casos es el constructor de copia llamada, si se copia un recipiente
- 14. ¿Por qué una clase utilizada como valor en un mapa STL necesita un constructor predeterminado en ...?
- 15. ¿Un constructor con plantilla reemplaza el constructor de copia implícita en C++?
- 16. En C#, ¿necesita llamar al constructor base?
- 17. implícito constructor de copia
- 18. ¿Por qué se llama al constructor de copia en lugar del constructor de conversión?
- 19. ¿Por qué no asigna este asignador C++ STL?
- 20. Por qué deshabilitar la asignación y el constructor de copia de CObject
- 21. C++ constructor de copia, los temporales y la semántica copia
- 22. invocando el constructor de copia dentro de otro constructor
- 23. ¿Por qué puede llamar a un constructor de copia que pasa en el objeto que está construyendo? (C++) (gcc)
- 24. C++ ¿Por qué vector de inicialización llama al constructor de copia
- 25. Por qué llamar explícitamente a un constructor en C++
- 26. ¿Por qué el constructor de copias oculta el constructor predeterminado en C++?
- 27. Callling object constructor/destructor con un asignador personalizado
- 28. ¿Para qué JAXB necesita un constructor público no-arg?
- 29. ¿qué significa asignador de STL
- 30. llamada al constructor de copia
Antes de C++ 11, los asignadores eran necesariamente apátridas. En consecuencia, llamar al constructor predeterminado sería suficiente.Después de C++ 11, si los asignadores se copian mediante sus contenedores adjuntos en una circunstancia determinada se determina mediante la presencia y la definición de los métodos de asignación de los asignadores 'select_on_container_X_Y'. Consulte la [referencia de los rasgos del asignador] (http://en.cppreference.com/w/cpp/memory/allocator_traits) – apmccartney