Frage

Ja, das habe ich mir angeschaut C++-Standards die ich finden konnte (oder die Entwürfe), aber ich finde keine umfassenden Ausnahmegarantien, die von STL-Containern gegeben werden.Ich kann nur vereinzelte Abschnitte mit unvollständigen Beschreibungen finden manche der Funktionen für manche der Typen.Oder vielleicht ist es da, aber ich finde es einfach nicht, ich weiß es nicht.

Notiz: Ich bin nicht Ich bitte um eine Liste aller Garantien, die den Leuten einfallen, was im Grunde in ist diese Frage.
Ich suche das maßgebliche Quelle dieser Informationen selbst – oder vorzugsweise eine kostenlose Version der Quelle (z. B.ein Entwurf des Standards), den ich mehr oder weniger als offiziell betrachten kann.

War es hilfreich?

Lösung

Das Lesen des Standards kann beängstigend sein (kommen wir zurück zum Standard), aber Bjarne Stroustrup hat in seinem Buch „The C++ Programming Language“ einen wirklich schönen Anhang zu diesem Thema geschrieben.Er hat diesen Anhang unter gepostet

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

Es ist ziemlich lang und detailliert (und gut geschrieben).Vielleicht finden Sie Abschnitt E.4 interessant, Zitat:

E.4 Standard-Container-Garantien

Wenn ein Bibliotheksvorgang selbst eine Ausnahme ausgelegt hat, kann und können Sie sicherstellen, dass die Objekte, auf denen sie arbeitet, in einem gut definierten Zustand gelassen werden.Zum Beispiel ist das Throwing out_of_range für einen Vektor (§16.3.3) kein Problem mit Ausnahmesicherheit für den Vektor.Der Verfasser von AT () hat kein Problem damit, dass sich ein Vektor vor dem Werfen in einem gut definierten Zustand befindet.

Darüber hinaus heißt es in Abschnitt E.4.1

Zusätzlich zur Grundgarantie bietet die Standardbibliothek die starke Garantie für einige Operationen, die Elemente einfügen oder entfernen.

Schauen Sie sich Seite 956 an.Es enthält eine Tabelle mit Garantien für verschiedene Operationen für Vektor, Deque, Liste und Karte.Zusammenfassend lässt sich sagen, dass alle Vorgänge an diesen Containern entweder „nthrow“ oder „strong“ sind, mit Ausnahme von N – Element in Karte einfügen das die grundlegenden Garantien bietet.

Notiz:Der obige Text ist alt und befasst sich nicht mit C++11, sollte aber für die meisten Ziele und Zwecke dennoch korrekt genug sein.

Wenn es um C++11 geht...

Im Standard heißt es zunächst zu den Containernarray, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack:bei

23.2.1/10:

Sofern nicht anders angegeben (siehe 23.2.4.1, 23.2.5.1, 23.3.3.4 und 23.3.6.5) erfüllen alle in dieser Klausel definierten Containertypen die folgenden zusätzlichen Anforderungen:

- Wenn eine Ausnahme von einer Funktion insert () oder emplace () während eines einzelnen Elements ausgelöst wird, hat diese Funktion keine Auswirkungen.
- Wenn eine Ausnahme durch eine Funktion push_back () oder push_front () ausgelöst wird, hat diese Funktion keine Auswirkungen.
- no erase (), clear (), pop_back () oder pop_front () macht eine Ausnahme.
- Kein Kopierkonstruktor oder Zuordnungsoperator eines zurückgegebenen Iterators macht eine Ausnahme.
— Keine swap()-Funktion löst eine Ausnahme aus.
- Keine SWAP () -Funktion macht alle Referenzen, Zeiger oder Iteratoren ungültig, die sich auf die Elemente der ausgetauschten Container beziehen.

Bei den in den jeweiligen oben genannten Abschnitten aufgezeigten Macken (jeweils als Ausnahmesicherheitsgarantien bezeichnet) handelt es sich hauptsächlich um spezielle Sonderfälle, wie etwa den Umgang mit Ausnahmen vom Hashing der enthaltenen Typen, Vergleichsoperationen sowie Throwing Swap und Throwing Move Operationen.

Andere Tipps

N3376

23.2.1 Allgemeine Behälteranforderungen [Container.Requirements.General]

Absatz 10

Sofern nicht anders angegeben (siehe 23.2.4.1, 23.2.5.1, 23.3.3.4, 23.2.5.1, 23.3.3.4, 23.3.6.5) Alle in dieser Klausel definierten Containertypen erfüllen die folgenden zusätzlichen Anforderungen:
- Wenn eine Ausnahme von einer SENINT ()- oder emplac () -Funktion während des Einfügens eines einzelnen Elements geworfen wird, hat diese Funktion keine Effekte.
- Wenn eine Ausnahme von einer Funktionen von Push_back () oder Push_Front () geworfen wird, hat diese Funktion keine Effekte.
- Keine Erase (), Clear (), Pop_back () oder Pop_front () -Funktion wirft eine Ausnahme aus.
- Kein Kopierkonstruktor oder Zuweisungsoperator eines zurückgegebenen Iterators wirft eine Ausnahme aus.
- Keine Swap () -Funktion wirft eine Ausnahme aus.
- Keine Swap () -Funktion ungültig von Referenzen, Zeigern, Zeigern oder Iteratoren, die sich auf die Elemente der ausgetauschenden Behälter beziehen.
[HINWEIS: Der End-Iterator von End () bezieht sich nicht auf ein beliebiges Element, sodass er ungültig gemacht werden kann. -Endnote]

23.2.4 Assoziative Container [Associative.Reqmts]

23.2.4.1 Ausnahmesicherheit garantiert [Associative.Reqmts.except]

1 für assoziative Container, keine klare () -funktion wirft eine Ausnahme aus. löschen (k) wirft keine Ausnahme aus, es sei denn, diese Ausnahme wird vom Vergleichsobjekt des Containers (falls vorhanden) geworfen.
2 für assoziative Container, wenn eine Ausnahme von einer beliebigen Operation innerhalb eines Einsatz- oder Herstellungsfunktions ein einzelnes Element geworfen wird, hat das Einfügen keine Wirkung.
3 Für assoziative Container wirft keine Swap-Funktion eine Ausnahme aus, es sei denn, diese Ausnahme wird durch den Swap des Vergleichenobjekts des Containers (falls vorhanden) geworfen.

23.2.5 Unordnung assoziative Behälter [UNORD.REQ]

23.2.5.1 Ausnahmesicherheit garantiert [UNORDE.REQ.except]

1 für ungeordnete assoziative Container, keine klare () -Funktion wirft eine Ausnahme aus. löschen (k) wirft keine Ausnahme aus, es sei denn, diese Ausnahme wird vom Hash- oder PRED-Objekt des Containers (falls vorhanden) geworfen.
2 für ungeordnete assoziative assoziative Container, wenn eine Ausnahme von einer anderen Operation als die Hashfunktion des Containers von in einem Einsatz oder der Hersteller-Funktion ein einzelnes Element ausgelöst wird, hat das Einfügen keine Wirkung.
3 Für ungeordnete assoziative assoziative Container wirft keine Swap-Funktion eine Ausnahme aus, es sei denn, diese Ausnahme wird durch den Swap des Hash- oder -ordnungsobjekts des Containers (falls vorhanden) geworfen.
4 für ungeordnete assoziative assoziative container, wenn eine Ausnahme von einer Rehash-Funktion aus einer Rehash-Funktion als von der Hash-Funktion oder Vergleichsfunktion des Containers ausgelöst wird, hat die Rehash () -Funktion keine Wirkung.

23.3.3.4 Disque-Modifikatoren [deque.modifiers]

void push_back (t && x); Absatz 2

Bemerkungen: Wenn eine Ausnahme ausgenommen wird, als vom Kopierkonstruktor, den Konstruktor, den Konstruktor, den Zuweisungsoperator, oder den Verschieben des Zuweisungsoperators von T einsetzen, gibt es keine Effekte. Wenn eine Ausnahme durch den Move-Konstruktor eines nicht kicherversenbaren T-Tauchers geworfen wird, sind die Effekte nicht spezifiziert.

iterator löschen (const_iterator zuerst, const_iterator zuletzt); Absatz 6

Wirt: Nichts, es sei denn, eine Ausnahme wird vom Kopierkonstruktor, den Konstruktor, den Konstruktor, den Zuweisungsoperator ausgeworfen oder den Zuweisungsoperator von t verschieben.

23.3.6.5 Vektor-Modifikatoren [vector.modifiers]

void push_back (t && x); Absatz 2

Wenn eine Ausnahme durch den Move-Konstruktor eines nicht kicherdeckbaren T ausgelöst wird, sind die Effekte nicht spezifiziert.

iterator löschen (const_iterator zuerst, const_iterator zuletzt); Absatz 5

Wirt: Nichts, es sei denn, eine Ausnahme wird vom Kopierkonstruktor, den Konstruktor, den Konstruktor, den Zuweisungsoperator ausgeworfen oder den Zuweisungsoperator von t verschieben.

Das Dokument, mit dem Sie mit dem N3337-Entwurf verbunden sind, kann als Beamter behandelt werden. Es ist der Standard-C ++ 11-Standard plus geringfügige redaktionelle Änderungen.

Sie müssen nur lernen, den Standard zu lesen, der verständlich ist, da er nicht leicht gelesen wird.

Um die Ausnahmegarantien für einen bestimmten Bibliotheksvorgang zu finden, überprüfen Sie diese Spezifikation der Operation für Anmerkungen und Kommentare zu Ausnahmen. Wenn die Funktion eine Mitgliedsfunktion ist, überprüfen Sie dann die Spezifikation des Typs für Kommentare zur Ausnahmesicherheit und welche Anforderungen erfüllt es. Überprüfen Sie dann die erfüllten Anforderungen an Ausnahmegarantien, die von Objekten vorgenommen werden müssen, um diese Anforderungen zu erfüllen.

für generische Typen und Algorithmen Überprüfen Sie auch die Anforderungen der Template-Parameter, um zu sehen, um zu sehen, welche Anforderungen diese Typen erfüllen müssen, damit alle Ausnahmegarantien des Typs oder der Algorithmus oder der Member-Funktion gedrückt werden müssen (wenn die Vorlage Die Parameter erfüllen nicht den angegebenen Anforderungen, die die Vorlage mit diesen Parametern verwenden, und nicht definiertes Verhalten und keine der Templifikationen der Vorlage gelten).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top