Pregunta

Sí, he visto la Los estándares de C ++ que pude encontrar (o los borradores), pero no estoy encontrando ninguna completa las garantías de excepción dadas por los contenedores STL.Todo lo que puedo encontrar son secciones ocasionales con descripciones incompletas en algunas de las funciones para algunos de los tipos.O tal vez está ahí, pero simplemente no lo estoy encontrando, no lo sé.

Nota: soy no Pedir una lista de todas las garantías que las personas pueden pensar, que es básicamente en esta pregunta .
Estoy buscando la fuente autorizada
de esta información en sí, o preferiblemente, una versión gratuita de la fuente (por ejemplo, un borrador de la norma) donde puedo tratar más o menos como oficial.

¿Fue útil?

Solución

La lectura de la norma puede ser aterradora (volvamos a la norma), pero Bjarne Strougstrup ha escrito un apéndice realmente agradable sobre este tema en su libro 'El lenguaje de programación de C ++'. Publicó este apéndice en

http://www.strougstrup.com/3rd_safe0.html , en http://www.strougstrup.com/3rd_safe.pdf

Es bastante largo y detallado (y bien escrito). Puede que, por ejemplo, encontrar la sección E.4 interesante, cita:

Garantías de contenedores estándar E.4

Si una operación de la biblioteca en sí, arroja una excepción, puede, y hace: Asegúrese de que los objetos en los que opera quedan en un Estado bien definido. Por ejemplo, en () lanzando out_of_range para un Vector (§16.3.3) no es un problema con la seguridad de excepción para el vector . El escritor de AT () no tiene problemas para asegurarse de que un vector esté en un Estado bien definido antes de lanzar.

Además, la sección E.4.1 establece

Además de la garantía básica, la biblioteca estándar ofrece el Fuerte garantía para algunas operaciones que inserte o eliminan elementos.

Eche un vistazo a la página 956. Contiene una tabla de garantías para varias operaciones para Vector, Deque, LIST y MAP. En resumen, todas las operaciones en esos contenedores son nothrow o strong, excepto n - elemento inserto en el mapa que ofrece las garantías básicas.

NOTA: El texto anterior es viejo y no aborda C ++ 11, pero aún debe ser lo suficientemente correcto para la mayoría de los objetivos y propósitos.

Cuando se trata de C ++ 11 ...

Los primeros estados estándar, sobre los contenedores array, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack: en

23.2.1 / 10 :

a menos que se especifique lo contrario (ver 23.2.4.1, 23.2.5.1, 23.3.3.4, y 23.3.6.5) Todos los tipos de contenedores definidos en esta cláusula cumplen los siguientes requisitos adicionales:

- Si se tira una excepción por una función INSERT () o EMPLPLE () mientras Inserción de un solo elemento, esa función no tiene efectos.
- Si una excepción es lanzada por una función Push_Back () o Push_Front (), Esa función no tiene efectos.
- No Borrar (), claro (), POP_BACK () o POP_FRONT () FUNCTION lanza un Excepción.
- Sin constructor de copia ni operador de asignación de un iterador devuelto arroja una excepción.
- No hay función de intercambio () arroja una excepción.
- Ninguna función de intercambio () invalida las referencias, los punteros o Iteradores que se refieren a los elementos de los contenedores que se intercambian.

Las peculiares señaladas en las secciones respectivas mencionadas anteriormente (cada una de las garantías de seguridad de excepción llamadas) se refieren principalmente a los casos especiales contra la pared, como cuando se trata de excepciones de los tipos contenidos "Hashing, operaciones de comparación, así como el intercambio de lanzamiento y lanzando operaciones de movimiento.

Otros consejos

N3376

23.2.1 Requisitos de contenedores generales [contenedor.requivements.general]

Párrafo 10

A menos que se especifique lo contrario (consulte 23.2.4.1, 23.2.5.1, 23.3.3.4 y 23.3.6.5) Todos los tipos de contenedores definidos en esta cláusula cumplen los siguientes requisitos adicionales: - Si se tira una excepción por una función de inserción () o emplazamiento () mientras se inserta un elemento único, esa función no tiene efectos.
- Si una excepción es lanzada por una función Push_Back () o Push_Front (), esa función no tiene efectos.
- No borrar (), claro (), POP_BACK () o POP_FRONT () FUNCTION lanza una excepción.
- Ningún constructor de copia o operador de asignación de un iterador devuelto arroja una excepción.
- No hay función de intercambio () arroja una excepción.
- Ninguna función de intercambio () invalida las referencias, los punteros o los iteradores que se refieren a los elementos de los contenedores que se intercambian.
[NOTA: El iterador final () no se refiere a ningún elemento, por lo que puede ser invalidado. -EnotNote]

23.2.4 Contenedores asociativos [asociativa.reqmts]

23.2.4.1 Garantías de seguridad de excepción [asociativa.reqmts.except]

1 Para contenedores asociativos, no hay función clara () arroja una excepción. Borrar (K) no lanza una excepción a menos que la excepción sea lanzada por el objeto Comparar el contenedor (si corresponde).
2 Para contenedores asociativos, si se tira una excepción por cualquier operación desde dentro de una función de inserción o EMPLPLO, insertando un solo elemento, la inserción no tiene efecto.
3 Para contenedores asociativos, ninguna función de intercambio lanza una excepción a menos que la excepción sea lanzada por el intercambio del objeto Comparar el contenedor (si corresponde).

23.2.5 Contenedores asociativos desordenados [UNORD.REQ]

23.2.5.1 Garantías de seguridad de excepción [unord.req.except]

1 Para contenedores asociativos desordenados, ninguna función clara () arroja una excepción. El borrado (k) no arroja una excepción a menos que la excepción sea lanzada por el hash o el objeto pred (si corresponde). 2 Para contenedores asociativos desordenados, si se tira una excepción por cualquier operación que no sea la función hash del contenedor dentro de una función de inserción o emplazamiento que inserta un elemento único, la inserción no tiene efecto.
3 Para contenedores asociativos desordenados, ninguna función de intercambio lanza una excepción a menos que la excepción sea lanzada por el intercambio del hash de contenedor o el objeto pred (si corresponde).
4 Para contenedores asociativos desordenados, si se lanza una excepción desde dentro de una función de rehash () que no sea la función HASHH de contenedor o la función de comparación, la función Rehash () no tiene efecto.

23.3.3.4 Modificadores de Deques [Deque.Modifiers]

Void Push_Back (T && x); Párrafo 2

Observaciones: Si se tira una excepción, excepto por el constructor de copia, mueva el constructor, el operador de asignación o el operador de asignación de la asignación de T no hay efectos. Si la excepción es lanzada por el constructor de movimiento de un t no codificado, los efectos no se especifican.

Borrar iterador (Primero Const_Eritator, Const_Eritator finalmente); Párrafo 6

lanza: nada a menos que la excepción sea lanzada por el constructor de copia, mueva el constructor, el operador de asignación o el operador de asignación de t.

23.3.6.5 Modificadores vectoriales [vector.modifiers]

Void Push_Back (T && x); Párrafo 2

Si la excepción es lanzada por el constructor de movimiento de un T no codifyinginsertable, los efectos no están especificados.

Borrar iterador (Primero Const_Eritator, Const_Eritator finalmente); Párrafo 5

lanza: nada a menos que la excepción sea lanzada por el constructor de copia, mueva el constructor, el operador de asignación o el operador de asignación de t.

El documento con el que ha vinculado, el N3337 Proyecto de estándar, puede ser tratado como oficial. Es la norma C ++ 11 más cambios editoriales menores.

Solo necesita aprender a leer el estándar, que es comprensible porque no está destinado a ser fácil de leer.

Para encontrar las garantías de excepción para cualquier operación en particular de la biblioteca, verifique la especificación de la operación para comentarios y comentarios sobre excepciones. Si la función es una función miembro, verifique la especificación del tipo para comentarios sobre la seguridad de la excepción y qué requisitos cumple. Luego, compruebe los requisitos cumplidos para garantías de excepción que deben realizarse con objetos para cumplir con esos requisitos.

Para los tipos genéricos y los algoritmos también revise los requisitos colocados en los parámetros de la plantilla para ver qué requisitos tienen que cumplir esos tipos en orden para todas las garantías de excepción realizadas por el tipo o algoritmo o función de miembro para mantener (si la plantilla Los parámetros no cumplen con los requisitos especificados, entonces use la plantilla con esos parámetros tiene un comportamiento indefinido y ninguna de las especificaciones de la plantilla se aplican).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top