Question

Oui, j'ai regardé le Normes C++ que j'ai pu trouver (ou les brouillons), mais je ne trouve aucune garantie complète des exceptions offertes par les conteneurs STL.Tout ce que je peux trouver, ce sont des sections occasionnelles avec des descriptions incomplètes sur quelques des fonctions pour quelques des genres.Ou peut-être qu'il est là mais je ne le trouve tout simplement pas, je ne sais pas.

Note: Je suis pas demander une liste de toutes les garanties auxquelles les gens peuvent penser, ce qui est essentiellement cette question.
je cherche le source faisant autorité de ces informations elles-mêmes -- ou de préférence, une version gratuite de la source (par ex.un projet de norme) que je peux plus ou moins considérer comme officiel.

Était-ce utile?

La solution

Lire le standard peut faire peur (revenons au standard), mais Bjarne Stroustrup a écrit une très belle annexe sur ce sujet dans son livre 'The C++ Programming Language'.Il a posté cette annexe à

http://www.stroustrup.com/3rd_safe0.html , àhttp://www.stroustrup.com/3rd_safe.pdf

C'est assez long et détaillé (et bien écrit).Vous pouvez par exemple trouver la section E.4 intéressante, citez :

E.4 Garanties standard des conteneurs

Si une opération de bibliothèque lui-même lance une exception, elle peut - et fait - assurer que les objets sur lesquels il fonctionnent sont laissés dans un état bien défini.Par exemple, à () lancer OUT_OF_RANGE pour un vecteur (§16.3.3) n'est pas un problème avec la sécurité des exceptions pour le vecteur.L'auteur de AT () n'a aucun problème à s'assurer qu'un vecteur est dans un état bien défini avant de lancer.

De plus, la section E.4.1 indique

En plus de la garantie de base, la bibliothèque standard offre la garantie solide pour quelques opérations qui insérent ou suppriment des éléments.

jetez un oeil à la page 956.Il contient un tableau de garanties pour diverses opérations pour vecteur, deque, liste et carte.En résumé, toutes les opérations sur ces conteneurs sont soit nulles, soit fortes, à l'exception de N - élément inséré dans la carte qui offre les garanties de base.

Note:le texte ci-dessus est ancien et ne concerne pas C++11, mais devrait quand même être suffisamment correct pour la plupart des objectifs et objectifs.

Quand il s'agit de C++11...

la norme indique d'abord, à propos des conteneursarray, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack

23.2.1/10:

Sauf indication contraire (voir 23.2.4.1, 23.2.5.1, 23.3.3.4 et 23.3.6.5) Tous les types de conteneurs définis dans la présente clause répondent aux exigences supplémentaires suivantes:

- Si une exception est lancée par une fonction insert () ou emplace () tout en insérant un seul élément, cette fonction n'a aucun effet.
- Si une exception est lancée par une fonction push_back () ou push_front (), cette fonction n'a aucun effet.
- pas d'effacement (), clear (), pop_back () ou pop_front () lance une exception.
- Aucun constructeur de copie ou opérateur d'affectation d'un itérateur retourné ne lance une exception.
- aucune fonction swap() ne lève d'exception.
- Aucune fonction swap () invalide aucune référence, pointeurs ou itérateurs faisant référence aux éléments des conteneurs échangés.

Les bizarreries soulignées dans les sections respectives mentionnées ci-dessus (chacune appelée garanties de sécurité des exceptions) concernent principalement des cas spéciaux contre le mur, comme lorsqu'il s'agit d'exceptions au hachage des types contenus, aux opérations de comparaison ainsi qu'au lancement de swap et de lancement de mouvement. opérations.

Autres conseils

N3376

23.2.1 Configuration générale des conteneurs [conteneur.requirs.General]

Paragraphe 10

Sauf indication contraire (voir 23.2.4.1, 23.2.5.1, 23.2.5.1, 23.3.4, et 23.3.6.5) Tous les types de conteneurs définis dans cette clause répondent aux exigences supplémentaires suivantes:
- Si une exception est lancée par une fonction insert () ou Emplace () tout en insérant un seul élément, cette fonction n'a aucun effet.
- Si une exception est lancée par une fonction push_back () ou push_front (), cette fonction n'a aucun effet.
- Pas d'effacement (), clair (), pop_back () ou pop_front () fonctionne une exception.
- Aucun constructeur de copie ou opérateur d'affectation d'un itérateur renvoyé ne jette une exception.
- Aucune fonction de swap () jette une exception.
- Aucune fonction SWAP () Invalide toutes les références, les pointeurs ou les itérateurs faisant référence aux éléments des conteneurs échangés.
[Remarque: l'itérateur final () ne fait référence à aucun élément, il peut donc être invalidé. -Endnote]

23.2.4 Conteneurs associatifs [associatier.reqmts]

23.2.4.1 Garanties de sécurité d'exception [associatier.reqmts.except]

1 pour les conteneurs associatifs, aucune fonction claire () ne jette une exception. Effacer (k) Ne jette pas une exception à moins que cette exception soit lancée par l'objet de comparaison du conteneur (le cas échéant).
2 Pour les conteneurs associatifs, si une exception est lancée par toute opération à partir d'une fonction Insertion ou Emplace insérant un seul élément, l'insertion n'a aucun effet.
3 Pour les conteneurs associatifs, aucune fonction d'échange ne jette une exception à moins que cette exception soit projetée par l'échange de l'objet de comparaison du conteneur (le cas échéant).

23.2.5 Contenants associatifs non ordonnés [UNORD.REQ]

23.2.5.1 Garanties de sécurité d'exception [unord.req.except]

1 pour les conteneurs associatifs non ordonnés, aucune fonction claire () ne jette une exception. Effacer (k) ne jette pas une exception à moins que cette exception soit lancée par le hachage du conteneur ou l'objet prédec (le cas échéant).
2 Pour les conteneurs associatifs non ordonnés, si une exception est projetée par toute opération autre que la fonction de hachage du conteneur de l'insertion ou de la fonction Emplace insérant un seul élément, l'insertion n'a aucun effet.
3 Pour les conteneurs associatifs non ordonnés, aucune fonction d'échange ne jette une exception à moins que cette exception soit lancée par l'échange du hachage du conteneur ou de l'objet prédée (le cas échéant).
4 Pour les conteneurs associatifs non ordonnés, si une exception est projetée à partir d'une fonction REVASH () autre que la fonction de hachage ou la fonction de comparaison du conteneur, la fonction REVASH () n'a aucun effet.

23.3.3.4 Modificateurs deque [DEQUE.MOFIERS]

void push_back (T && x); Paragraphe 2

Remarques: Si une exception est lancée autre que par le constructeur de copie, déplacez le constructeur, l'opérateur d'affectation ou le déplacement de l'opérateur d'affectation de T Il n'y a aucun effet. Si une exception est projetée par le constructeur de déplacement d'un t non -Colousttable T, les effets sont non spécifiés.

Itérateur Erase (const_iterator d'abord, const_iterator enfin); Paragraphe 6

lance: rien sauf si une exception n'est levée par le constructeur de copie, déplacer le constructeur, l'opérateur d'affectation ou le déplacement de l'opérateur d'attribution de t.

23.3.6.5 Modificateurs de vecteur [Vector.Modificateurs]

void push_back (T && x); Paragraphe 2

Si une exception est lancée par le constructeur de déplacement d'un t non -Colousttable T, les effets sont non spécifiés.

Itérateur Erase (const_iterator d'abord, const_iterator enfin); Paragraphe 5

lance: rien sauf si une exception n'est levée par le constructeur de copie, déplacer le constructeur, l'opérateur d'affectation ou le déplacement de l'opérateur d'attribution de t.

Le document que vous avez lié à, le projet de norme N3337, peut être traité comme officiel. C'est la norme C ++ 11 Plus changements éditoriaux mineurs.

Vous devez juste apprendre à lire la norme, ce qui est compréhensible car il n'est pas destiné à être une lecture facile.

Pour trouver les garanties d'exception pour toute opération de bibliothèque particulière, vérifiez que les spécifications de l'opération pour des remarques et des commentaires sur des exceptions. Si la fonction est une fonction membre, vérifiez la spécification du type pour commentaires sur la sécurité des exceptions et sur les exigences qu'il remplit. Ensuite, vérifiez les exigences satisfaisantes pour les garanties d'exception à effectuer par des objets pour répondre à ces exigences.

Pour les types génériques et les algorithmes, vérifiez également les exigences imposées sur les paramètres de modèle afin de déterminer les exigences de ces types à respecter pour toutes les garanties d'exception effectuées par le type ou l'algorithme ou la fonction de membre (si le modèle Les paramètres ne répondent pas aux exigences spécifiées, puis à l'aide du modèle avec ces paramètres a un comportement non défini et aucune des spécifications du modèle ne s'applique).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top